數據讀寫
詳細看官網:http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrameReader
hive數據
讀取:
# 讀取hive要加enableHiveSupport(),以可以使用hql對hive進行操作
spark = SparkSession.builder.enableHiveSupport().master("local[*]").appName("read_hive").getOrCreate()
df=spark.sql("select * from age")
df.show()
+--------------+------+
| country|median|
+--------------+------+
| New Zealand| 39.0|
+--------------+------+
only showing top 20 rows
寫入:
# 創建表格
spark.sql('create table if not exists age2(name string, num int)')
# 將dataframe寫入表格
df.write.insertInto("age2")#動態分區會覆蓋,否則是追加模式的
df.write.mode("overwrite).saveAsTable("age2")#覆蓋
# 驗證寫入數據
spark.sql('select * from age2 sort by num limit 1 ').show()
+-----------+---+
| name|num|
+-----------+---+
|New Zealand| 39|
+-----------+---+
note :
1、如果表有分區,使用
配置下動態插入:
val sparkConf = new SparkConf()
//KryoSerialization速度快,是JavaSerializer的10倍以上,可以配置爲任何org.apache.spark.serializer的子類。但Kryo也不支持所有實現了
// java.io.Serializable 接口的類型。只支持JavaSerializer
sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
sparkConf.set("spark.rdd.compress", "true")
sparkConf.set("spark.speculation.interval", "10000ms")
sparkConf.set("spark.sql.tungsten.enabled", "true")
sparkConf.set("hive.exec.dynamic.partition", "true")
sparkConf.set("hive.exec.dynamic.partition.mode", "nonstrict")
val spark = SparkSession.builder()
.appName("")
.enableHiveSupport()
.config(sparkConf).getOrCreate()
在使用如下可以正常的插入分區並且覆蓋分區。
val tagDF = spark.sql(s"select id,device_uuid,aver_score,'$dt' from tmp_3)//dt是時間分區
tagDF.repartition(100)
.write
.mode("overwrite")
.insertInto("pmp_3")
已經測試,但是對於沒有分區的表,使用insertinto 數據會出現重複空值
這個時間,如果沒有分區使用saveAsTable overwrite可以完全覆蓋,命令如下
val tagDf = spark.sql("select id,device_uuid,score from pmp_tmp_1")
tagDf.repartition(100)
.write
.mode("overwrite")
.saveAsTable("pmp_tmp_1")