UnsupportedOperationException:未实现的类型:DoubleType

时间:2018-06-08 20:28:21

标签: pyspark snowflake-datawarehouse snowflake

我正在尝试使用我编写的函数将一个pyspark df写入Snowflake:

def s3_to_snowflake(schema, table):

    df = get_dataframe(schema, table, sqlContext)

    username = user
    password = passw
    account = acct

    snowflake_options = {
        "sfURL" : account+".us-east-1.snowflakecomputing.com",
        "sfAccount" : account,
        "sfUser" : username,
        "sfPassword" : password,
        "sfDatabase" : "database",
        "sfSchema" : schema,
        "sfWarehouse" : "demo_wh"
    }

    sc._jsc.hadoopConfiguration().set("fs.s3.awsAccessKeyId", "KeyId")
    sc._jsc.hadoopConfiguration().set("fs.s3.awsSecretAccessKey", 
"AccessKey")

    (
      df
      .write
      .format("net.snowflake.spark.snowflake")
      .mode("overwrite")
      .options(**snowflake_options)
      .option("dbtable", table)
      .option('tempDir', 's3://data-temp-loads/snowflake')
      .save()
    )

    print('Wrote {0} to {1}.'.format(table, schema))

除了我在datalake中获得的一个表外,这个函数已经有效。 这是我正在尝试写的表的架构。

root
|-- credit_transaction_id: string (nullable = true)
|-- credit_deduction_amt: double (nullable = true)
|-- credit_adjustment_time: timestamp (nullable = true)

我得到的错误看起来像Snowflake正在解决DoubleType列问题。我在使用Avro / ORC文件类型之前使用Hive时遇到过这个问题。通常,这是将一种数据类型转换为另一种数据类型的问题。

我尝试过的事情:

  • 投射(Double to Float,Double to String,Double to Numeric-最后一个Snowflake docs
  • 重新传入传入表的DDL,尝试Float,String和Numeric types

另外需要注意的是:我成功传输的一些表具有DoubleType列。不确定此表的问题是什么。

1 个答案:

答案 0 :(得分:1)

在线搜索后,我觉得Spark的Parquet读者会抛出这个错误:

https://github.com/apache/spark/blob/branch-2.0/sql/core/src/main/java/org/apache/spark/sql/execution/datasources/parquet/VectorizedColumnReader.java

您的文件是否定义了df Parquet?我认为这可能是读错误而不是写错误;值得看看get_dataframe中发生了什么。

谢谢, etduwx