客快物流大資料專案(四十四):Spark操作Kudu建立表

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

Spark操作Kudu建立表

  • Spark與KUDU整合支援:
    • DDL操作(建立/刪除)
    • 本地Kudu RDD
    • Native Kudu資料來源,用於DataFrame整合
    • 從kudu讀取資料
    • 從Kudu執行插入/更新/ upsert /刪除
    • 謂詞下推
    • Kudu和Spark SQL之間的模式對映
    • 到目前為止,我們已經聽說過幾個上下文,例如SparkContext,SQLContext,HiveContext, SparkSession,現在,我們將使用Kudu引入一個KuduContext。這是可以在Spark應用程式中廣播的主要可序列化物件。此類代表在Spark執行程式中與Kudu Java客戶端進行互動。
    • KuduContext提供執行DDL操作所需的方法,與本機Kudu RDD的介面,對資料執行更新/插入/刪除,將資料型別從Kudu轉換為Spark等。

建立表

  • 定義kudu的表需要分成5個步驟:
    • 提供表名
    • 提供schema
    • 提供主鍵
    • 定義重要選項;例如:定義分割槽的schema
    • 呼叫create Table api
  • 程式碼開發
package cn.it

import java.util
import cn.it.SparkKuduDemo.TABLE_NAME
import org.apache.kudu.client.CreateTableOptions
import org.apache.kudu.spark.kudu.KuduContext
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}

object SparkKuduTest {
  def main(args: Array[String]): Unit = {
    //構建sparkConf物件
    val sparkConf: SparkConf = new SparkConf().setAppName("SparkKuduTest").setMaster("local[2]")

    //構建SparkSession物件
    val sparkSession: SparkSession = SparkSession.builder().config(sparkConf).getOrCreate()

    //獲取sparkContext物件
    val sc: SparkContext = sparkSession.sparkContext
    sc.setLogLevel("warn")

    //構建KuduContext物件
    val kuduContext = new KuduContext("node2:7051", sc)

    //1.建立表操作
    createTable(kuduContext)

    /**
     * 建立表
     *
     * @param kuduContext
     * @return
     */
    def createTable(kuduContext: KuduContext) = {
      //如果表不存在就去建立
      if (!kuduContext.tableExists(TABLE_NAME)) {

        //構建建立表的表結構資訊,就是定義表的欄位和型別
        val schema: StructType = StructType(
          StructField("userId", StringType, false) ::
            StructField("name", StringType, false) ::
            StructField("age", IntegerType, false) ::
            StructField("sex", StringType, false) :: Nil)

        //指定表的主鍵欄位
        val keys = List("userId")

        //指定建立表所需要的相關屬性
        val options: CreateTableOptions = new CreateTableOptions
        //定義分割槽的欄位
        val partitionList = new util.ArrayList[String]
        partitionList.add("userId")
        //新增分割槽方式為hash分割槽
        options.addHashPartitions(partitionList, 6)

        //建立表
        kuduContext.createTable(TABLE_NAME, schema, keys, options)
      }
    }
  }
}

定義表時要注意的是Kudu表選項值。你會注意到在指定組成範圍分割槽列的列名列表時我們呼叫“asJava”方 法。這是因為在這裡,我們呼叫了Kudu Java客戶端本身,它需要Java物件(即java.util.List)而不是Scala的List對 象;(要使“asJava”方法可用,請記住匯入JavaConverters庫。) 建立表後,透過將瀏覽器指向http//master主機名:8051/tables

  • 來檢視Kudu主UI可以找到建立的表,透過單擊表ID,能夠看到表模式和分割槽資訊。
客快物流大資料專案(四十四):Spark操作Kudu建立表

點選Table id 可以觀察到表的schema等資訊:

客快物流大資料專案(四十四):Spark操作Kudu建立表

相關文章