SparkParquet文件加载不同的模式

k2fxgqgv  于 2021-05-27  发布在  Spark
关注(0)|答案(5)|浏览(383)

我们使用两种不同的模式生成Parquet文件,其中包含id和amount字段。
文件:
file1.snappy.Parquet地板
编号:int
金额:十进制(15,6)
内容:
1,19500.00
2,198.34
file2.snappy.Parquet地板
编号:int
金额:十进制(15,2)
内容:
1,19500.00
3,198.34
当我同时加载这两个文件df3=spark.read.parquet(“output/”)并试图获取数据时,它推断出十进制(15,6)的模式是对包含十进制数(16,2)的量的文件的,并且文件数据被错误地操作。有没有一个方法,我可以检索到这个案件的数据正确。
执行df3.show()后可以看到的最终输出
+---+

7gcisfzg

7gcisfzg1#

-------+
在这里,如果你看到第一和第二行的金额被错误地操纵。
寻找一些关于这个的建议。我知道,如果我们用相同的模式重新生成文件,这个问题就会消失,这需要重新生成和替换已交付的文件,在我们重新生成这些文件的过程中,是否有其他临时方法可以使用。
~r~克里斯

monwx1rj

monwx1rj2#

-------+
| 1|        1.950000|
| 3|        0.019834|
| 1|19500.000000|
| 2|    198.340000|
+---+

w80xi6nr

w80xi6nr3#

您可以尝试将mergeschema属性用作true。所以

df3 = spark.read.parquet("output/")

试试这个:

df3 = spark.read.option("mergeSchema","true").parquet("output/")

这对你来说应该有用。

uelo1irk

uelo1irk4#

-------+
|身份证|       金额|
+---+

qvtsj1bj

qvtsj1bj5#

尝试将其作为字符串读取,并在读取文件时手动提供架构

schema = StructType([
StructField("flag_piece", StringType(), True)
])

spark.read.format("parquet").schema(schema).load(path)

相关问题