pyspark 未缩放值对于精确火花来说太大

pyspark unscaled value too large for precision spark

我正在尝试读取由 pyspark 使用不同架构编写的 avro 文件。 decimal 列的精度差异。下面是我用 pyspark

编写的 avro 文件夹的文件夹结构
/mywork/avro_data/day1/part-*
/mywork/avro_data/day2/part-*

下面是它们的架构

day1 = spark.read.format('avro').load('/mywork/avro_data/day1')
day1.printSchema()
root
 |-- price: decimal(5,2) (nullable = True)

day2 = spark.read.format('avro').load('/mywork/avro_data/day2')
day2.printSchema()
root
 |-- price: decimal(20,2) (nullable = True)

在读取整个数据帧时(两天)

>>> df = spark.read.format('avro').load('/mywork/avro_data/')

给出以下错误

java.lang.IllegalArgumentException: unscaled value too large for precision spark

为什么 pyspark 不隐含地考虑更高的模式(向后兼容)

spark 使用第一个样本记录来推断模式。我认为,在您的情况下,示例记录是 decimal(5, 2) 导致此异常。 关于你的问题-

Why does pyspark doesn't implicitly considers the higher schema?

为此,spark需要读取整个数据两次。首先推断模式,其次进行处理。 想象一下,即使 df.limit(1) 也会先读取整个文件来推断模式,然后再读取第一个记录,如果你这样做的话。

有一个选项可以指定 avroSchema 选项,如下所示 -

 val p = spark
      .read
      .format("avro")
      .option("avroSchema", schema.toString)
      .load(directory)
    p.show(false)

但是这里 .load(directory) 中的每个 avro 文件都应该匹配模式,而这里不是这种情况。

Alternative

读取两个数据帧然后合并