spark写入hive出现数据不一致

记录一下这次遇到的诡异的坑,就是spark写入hive出现数据不一致的问题。

  1. 问题描述如下:

    1. 使用spark创建dataframe,通过createOrReplaceTempView创建临时表

    2. 检查创建的临时表,与DataFrame的数据保持一致

    3. 执行插入hive分区的sql命令

      insert
          overwrite table xxx.xxx partition (pt)
      select
          field1,
          field2,
          ...,
          pt
      from
          temp_tbl
      
    4. 发现hive表结果与DataFrame的数据不一致

  2. 问题定位:

    原来在hive创建外表的时候,没有指定保存格式,登陆S3发现其默认保存的格式为csv。由于有个字段里面的字符串格式比较复杂,导致在写入hive的时候出现窜位情况。

  3. 解决方案:

    在创建hive外表时,指定存储格式为parquet(跟spark保持一致,当然也可以使用orc)

    create external table xxx.xxx (
        xxx
    )
    partitioned by (pt string)
    stored as parquet
    location 's3://bucketname/path'
    

    在研究解决方案的时候,发现spark的DataFrame有API可以直接写入hive, 这样就可以避免先创建临时表再用sql来写入了。

    df.select("xxx").write.mode("overwrite").format("parquet").insertInto("xxx.xxx")
    

    需要注意的是: spark告诉你不需要通过partitionBy的方式来指定分区,但是我们的DataFrame字段顺序需要与hive表保持一致,分区字段放在最后面

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值