scala 中 insertinto 插入hive數據數據重複或者亂碼或者爲空

數據讀寫

詳細看官網: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")

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章