将数据帧保存为Parquet在Pyspark中不起作用

时间:2015-04-22 22:49:31

标签: apache-spark apache-spark-sql pyspark

我使用Spark SQL和Pyspark从SQL Server上的表创建数据帧df

df.printSchema()
root
 |-- DATE1: date (nullable = true)
 |-- ID: decimal (nullable = false)
 |-- CODE: string (nullable = true)
 |-- DATE2: timestamp (nullable = true)

这是正确的,

type(df)
<class 'pyspark.sql.dataframe.DataFrame'>

这看起来也不错。

现在我想将表保存为镶木地板文件,这应该很简单,但这导致我遇到Unsupported datatype DecimalType()错误的问题:

df.save("test.parquet")

我收到此错误:

    Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/user1/spark/python/pyspark/sql/dataframe.py", line 209, in save
    self._jdf.save(source, jmode, joptions)
  File "/home/user1/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py", line 538, in __call__
  File "/home/user1/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/protocol.py", line 300, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o39.save.
: java.lang.RuntimeException: Unsupported datatype DecimalType()
    at scala.sys.package$.error(package.scala:27)
    at ... 

我找到了this,但这并没有描述我正在处理的事情。该表只有一般的十进制数。谁知道发生了什么?谢谢。

1 个答案:

答案 0 :(得分:3)

我相信您找到的链接是正确的,需要在Spark 1.4.0中由SPARK-4176修复。

您的ID字段可能被定义为非常宽的小数。在Oracle中,如果未指定比例和精度,则会给出38位小数。这导致您在示例中看到的相同错误。

更新事实证明,当Spark SQL加载表时,它会丢弃数据库中十进制字段的精度信息。十进制字段被视为无限精度,从而触发SPARK-4176。这个问题的症状应该在Spark 1.4中消失,但是我会尝试将JIRA放在一起解决原因。

更新已创建问题SPARK-7196