客快物流大資料專案(四十五):Spark操作Kudu DML操作

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

Spark操作Kudu DML操作

客快物流大資料專案(四十五):Spark操作Kudu DML操作

Kudu支援許多DML型別的操作,其中一些操作包含在Spark on Kudu整合. 包括:

  • INSERT - 將DataFrame的行插入Kudu表。請注意,雖然API完全支援INSERT,但不鼓勵在Spark中使用它。 使用INSERT是有風險的,因為Spark任務可能需要重新執行,這意味著可能要求再次插入已插入的行。這樣做會導致失敗,因為如果行已經存在,INSERT將不允許插入行(導致失敗)。相反,我們鼓勵使用下面描述 的INSERT_IGNORE。
  • INSERT-IGNORE - 將DataFrame的行插入Kudu表。如果表存在,則忽略插入動作。
  • DELETE - 從Kudu表中刪除DataFrame中的行
  • UPSERT - 如果存在,則在Kudu表中更新DataFrame中的行,否則執行插入操作。
  • UPDATE - 更新dataframe中的行

一、插入資料insert操作

先建立一張表,然後把資料插入到表中

package cn.it

import java.util

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


object SparkKuduTest {
  //定義樣例類
  case class person(id:Int, name:String, age:Int, sex:Int)
  
  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)
      }
    }

    /**
     * 2)載入資料
     * @param session
     * @param sc
     * @param kuduContext
     */
    def inserData(session: SparkSession, sc: SparkContext, kuduContext: KuduContext): Unit = {
      //定義資料
      val data = List(person(1, "tom", 30, 1), person(2, "mark", 26, 0))
      val personRDD = sc.makeRDD(data)
      import session.implicits._
      val dataFrame: DataFrame = personRDD.toDF

      kuduContext.insertRows(dataFrame, TABLE_NAME)
    }
  }
}

二、刪除資料delete操作

/**
 * 4)刪除資料
 * @param session
 * @param kuduContext
 */
def deleteData(session: SparkSession, kuduContext: KuduContext): Unit = {
  //定義資料
  val data = List(person(1, "tom", 50, 1), person(2, "mark", 30, 0))

  import session.implicits._
  val dataFrame: DataFrame = data.toDF().select("id")

  kuduContext.deleteRows(dataFrame, TABLE_NAME)
}

三、更新資料upsert操作

/**
 * 3)修改資料
 * @param session
 * @param kuduContext
 */
def upDATEData(session: SparkSession, kuduContext: KuduContext): Unit = {
  //定義資料
  val data = List(person(1, "tom", 50, 1), person(2, "mark", 30, 0))

  import session.implicits._
  val dataFrame: DataFrame = data.toDF()

  kuduContext.upDATERows(dataFrame, TABLE_NAME)
}
本文參與 騰訊雲自媒體分享計劃,分享自作者個人站點/部落格。

相關文章