【问题标题】:spark write as string and read partition column as numeric [duplicate]spark写入为字符串并将分区列读取为数字[重复]
【发布时间】:2021-12-30 01:14:22
【问题描述】:

发现我的业务代码有一些非法数据,debug后发现这个bug是spark partitions resolve引起的,不改写partition列怎么办才能避免这个问题。

import org.apache.spark.sql.functions.lit
import spark.implicits._

val df = Seq(("122D", 2), ("122F", 2), ("122", 2))
      .toDF("no", "value")
      .withColumn("other", lit(1))

val path = "/user/my/output"

df
  .write
  .partitionBy("no","value")
  .parquet(path)

我的预期结果被读取为 aame as write

df.show()
+----+-----+-----+
|  no|value|other|
+----+-----+-----+
|122D|    2|    1|
|122F|    2|    1|
| 122|    2|    1|
+----+-----+-----+

// df.distinct.count==3

这样的实际读取结果

val read=spark.read.parquet(path)

read.show()
+-----+-----+-----+
|other|   no|value|
+-----+-----+-----+
|    1|122.0|    2|
|    1|122.0|    2|
|    1|122.0|    2|
+-----+-----+-----+

// read.distinct.count==1

检查output 目录结构是这样的

└─output
    ├─no=122
    │  └─value=2
    ├─no=122D
    │  └─value=2
    └─no=122F
        └─value=2

非常感谢。 我的 spark 版本是 2.4.5 而 scala 版本是 2.11.12

【问题讨论】:

    标签: scala apache-spark parquet partition


    【解决方案1】:

    只需添加spark.conf.set("spark.sql.sources.partitionColumnTypeInference.enabled",false)

    【讨论】:

      【解决方案2】:

      理论知识:所有内置文件源(包括Text/CSV/JSON/ORC/Parquet)都能够自动发现和推断分区信息。自动推断分区列的数据类型。

      您可以使用spark.sql.sources.partitionColumnTypeInference.enabled 为 False。

      确保:当类型推断被禁用时,字符串类型将用于分区列。

      【讨论】:

        猜你喜欢
        • 2018-09-15
        • 1970-01-01
        • 1970-01-01
        • 2017-06-28
        • 2013-08-19
        • 1970-01-01
        • 2013-02-13
        • 2015-08-01
        相关资源
        最近更新 更多