【发布时间】: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