我将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。