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 =