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
读取两个数据帧然后合并
我正在尝试读取由 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
读取两个数据帧然后合并