将数据帧另存为在 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 ... 

发现了这个,但这并不能描述我正在处理的内容。此表只有普通的十进制数字。有人知道发生了什么吗?谢谢。

我相信

您找到的链接是正确的,将由Spark 4176中的SPARK-1.4.0修复。

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

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

更新已创建问题 SPARK-7196。

相关内容

  • 没有找到相关文章

最新更新