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")

 

你可能感兴趣的:(dataprocessing,scala)