我使用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,但这并没有描述我正在处理的事情。该表只有一般的十进制数。谁知道发生了什么?谢谢。
答案 0 :(得分:3)
我相信您找到的链接是正确的,需要在Spark 1.4.0中由SPARK-4176修复。
您的ID字段可能被定义为非常宽的小数。在Oracle中,如果未指定比例和精度,则会给出38位小数。这导致您在示例中看到的相同错误。
更新事实证明,当Spark SQL加载表时,它会丢弃数据库中十进制字段的精度信息。十进制字段被视为无限精度,从而触发SPARK-4176。这个问题的症状应该在Spark 1.4中消失,但是我会尝试将JIRA放在一起解决原因。
更新已创建问题SPARK-7196。