【问题标题】:pyspark unscaled value too large for precision sparkpyspark 未缩放的值对于精确火花来说太大了
【发布时间】:2020-07-07 20:03:54
【问题描述】:

我正在尝试读取 pyspark 使用不同架构编写的 avro 文件。小数列的精度差异。下面是我用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-2.4.4 和 python 3.7.4

标签: dataframe pyspark avro


【解决方案1】:

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

为什么 pyspark 不隐式考虑更高的架构?

为此,spark 需要读取整个数据两次。首先推断模式,然后进行处理。 想象一下,即使df.limit(1) 也会先读取整个文件以推断架构,然后再读取第一条记录。

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

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

但这里.load(directory) 中的每个 avro 文件都应该与这里的架构相匹配。

Alternative

读取两个数据框,然后合并

【讨论】:

  • 明确传递数据帧模式听起来有点奇怪(尽管它有效),因为 avro 已经在其中嵌入了模式,不像 csv.. 替代方案看起来像是一种解决方法。没有其他方法可以实现吗?
  • 我觉得没有别的办法了
猜你喜欢
  • 2012-11-10
  • 2012-10-18
  • 1970-01-01
  • 2019-07-29
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
相关资源
最近更新 更多