Spark 以字符串形式写入并将分区列以数字形式读取

Sum*_*ing 0 scala partition apache-spark parquet

我发现我的业务代码中有一些非法数据,经过调试,我发现这个错误是由spark分区解析引起的,我应该如何做才能避免这个问题而不更改写入分区列。

\n
import org.apache.spark.sql.functions.lit\nimport spark.implicits._\n\nval df = Seq(("122D", 2), ("122F", 2), ("122", 2))\n      .toDF("no", "value")\n      .withColumn("other", lit(1))\n\nval path = "/user/my/output"\n\ndf\n  .write\n  .partitionBy("no","value")\n  .parquet(path)\n
Run Code Online (Sandbox Code Playgroud)\n

我的预期结果是读为 aame 为 write

\n
df.show()\n+----+-----+-----+\n|  no|value|other|\n+----+-----+-----+\n|122D|    2|    1|\n|122F|    2|    1|\n| 122|    2|    1|\n+----+-----+-----+\n\n// df.distinct.count==3\n
Run Code Online (Sandbox Code Playgroud)\n

实际读取结果是这样的

\n
val read=spark.read.parquet(path)\n\nread.show()\n+-----+-----+-----+\n|other|   no|value|\n+-----+-----+-----+\n|    1|122.0|    2|\n|    1|122.0|    2|\n|    1|122.0|    2|\n+-----+-----+-----+\n\n// read.distinct.count==1\n\n
Run Code Online (Sandbox Code Playgroud)\n

检查output目录结构是这样的

\n
\xe2\x94\x94\xe2\x94\x80output\n    \xe2\x94\x9c\xe2\x94\x80no=122\n    \xe2\x94\x82  \xe2\x94\x94\xe2\x94\x80value=2\n    \xe2\x94\x9c\xe2\x94\x80no=122D\n    \xe2\x94\x82  \xe2\x94\x94\xe2\x94\x80value=2\n    \xe2\x94\x94\xe2\x94\x80no=122F\n        \xe2\x94\x94\xe2\x94\x80value=2\n
Run Code Online (Sandbox Code Playgroud)\n

非常感谢。\n我的 Spark 版本是2.4.5,scala 版本是2.11.12

\n

Sum*_*ing 5

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