客快物流大資料專案(四十六):Spark操作Kudu dataFrame操作kudu

十一vs十一發表於2024-03-30

Spark操作Kudu dataFrame操作kudu

客快物流大資料專案(四十六):Spark操作Kudu dataFrame操作kudu

一、DataFrameApi讀取kudu表中的資料

雖然我們可以透過上面顯示的KuduContext執行大量操作,但我們還可以直接從預設資料來源本身呼叫讀/寫API。要設定讀取,我們需要為Kudu表指定選項,命名我們要讀取的表以及為表提供服務的Kudu叢集的Kudu主伺服器列表。

  • 程式碼示例
/**
 * 使用DataFrameApi讀取kudu表中的資料
 * @param sparkSession
 * @param kuduMaster
 * @param tableName
 */
def getTableData(sparkSession: SparkSession, kuduMaster: String, tableName: String): Unit = {
  //定義map集合,封裝kudu的master地址和要讀取的表名
  val options = Map(
    "kudu.master" -> kuduMaster,
    "kudu.table" -> tableName
  )
  sparkSession.read.options(options).kudu.show()
}

二、 DataFrameApi寫資料到kudu表中

在透過DataFrame API編寫時,目前只支援一種模式“append”。尚未實現的“覆蓋”模式。

  • 程式碼示例
/**
 * 6)DataFrameApi寫資料到kudu表中
 */
def dataFrame2Kudu(session: SparkSession, kuduContext: KuduContext): Unit ={
  val data = List(person(3, "canglaoshi", 14, 0), person(4, "xiaowang", 18, 1))
  import  session.implicits._
  val dataFrame = data.toDF

  //目前,在kudu中,資料的寫入只支援append追加
  dataFrame.write.mode("append").options(kuduOptions).kudu

  //檢視結果
  //導包
  import org.apache.kudu.spark.kudu._
  //載入表的資料,導包呼叫kudu方法,轉換為dataFrame,最後在使用show方法顯示結果
  sparkSession.read.options(kuduOptions).kudu.show()
}

三、​​​​​​​使用sparksql操作kudu表

可以選擇使用Spark SQL直接使用INSERT語句寫入Kudu表;與'append'類似,INSERT語句實際上將預設使用 UPSERT語義處理;

  • 程式碼示例
/**
 * 使用sparksql操作kudu表
 * @param sparkSession
 * @param sc
 * @param kuduMaster
 * @param tableName
 */
def SparkSql2Kudu(sparkSession: SparkSession, sc: SparkContext, kuduMaster: String, tableName: String): Unit = {
  //定義map集合,封裝kudu的master地址和表名
  val options = Map(
    "kudu.master" -> kuduMaster,
    "kudu.table" -> tableName
  )
  val data = List(persont(10, "小張", 30, 0), person(11, "小王", 40, 0))
  import sparkSession.implicits._
  val dataFrame: DataFrame = sc.parallelize(data).toDF
  //把dataFrame註冊成一張表
  dataFrame.createTempView("temp1")

  //獲取kudu表中的資料,然後註冊成一張表
  sparkSession.read.options(options).kudu.createTempView("temp2")
  //使用sparkSQL的insert操作插入資料
  sparkSession.sql("insert into table temp2 select * from temp1")
  sparkSession.sql("select * from temp2 where age >30").show()

相關文章