1.从kudu中加载数据
使用pyspark需要导入spark中的包,并且初始化SparkSession。
import os
import sys
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("test").getOrCreate()
2.读取kudu中的数据
df=spark.read.format("org.apache.kudu.spark.kudu") \
.option("kudu.table", "kudutable") \
.option('kudu.master', "kudu_master1:7051,kudu_master2:7051,kudu_master3:7051") \
.load()
3.把dateframe中的数据写入kudu
df.write.format('org.apache.kudu.spark.kudu') \
.option('kudu.master', "kudu_master1:7051,kudu_master2:7051,kudu_master3:7051") \
.mode('append') \
.option('kudu.table', "test")\
.save()
dataframe的数据写入kudu有4种模式:
- insert 插入模式,表中不能存在key相同的,否则会报错。
- insert-ignore 忽略模式,表中没有的会插入,有的则不插入保留原数据。
- upsert 替换模式,表中没有的会插入,有的则替换为现在的数据。
- update 更新模式,只会更新表中已经存在的数据。
- delete 删除模式,只能删除key值相同的。
在不加kudu.option参数的时候,默认使用的upsert模式,上面的代码就相当于这样:
df.write.format('org.apache.kudu.spark.kudu’)
.option('kudu.master’, 'kudu_master1:7051,kudu_master2:7051,kudu_master3:7051')
.mode('append’)
.option('kudu.table', 'test')
.option('kudu.option', 'upsert')
.save()
4.删除kudu中的数据
使用scala和java开发spark,都有直接操作kudu客户端的Api,但很遗憾,pyspark中对这一功能还不支持。只能使用很麻烦的spark Api来删除。
删除kudu中的数据需要先读取,然后转换为只有key的dataframe才可以。
df=spark.read.format("org.apache.kudu.spark.kudu") \
.option("kudu.table", "kudutable") \
.option('kudu.master', "kudu_master1:7051,kudu_master2:7051,kudu_master3:7051") \
.load()
df_result=df.filter("age>10").select("id")
df.write.format('org.apache.kudu.spark.kudu’)
.option('kudu.master’, 'kudu_master1:7051,kudu_master2:7051,kudu_master3:7051')
.mode('append’)
.option('kudu.table', 'test')
.option('kudu.option', 'delete')
.save()
总结
使用pyspark操作kudu非常简单,有其便利的地方,也有不利的地方,不能使用kudu Api操作影响太大了,性能也不好,还是尽量使用scala开发吧。