【问题标题】:Spark SQL throwing error "java.lang.UnsupportedOperationException: Unknown field type: void"Spark SQL 抛出错误“java.lang.UnsupportedOperationException:未知字段类型:无效”
【发布时间】:2017-12-27 06:38:18
【问题描述】:

在创建列值默认为 NULL 的表时,我在 Spark(1.6) SQL 中遇到错误。例如:创建表test as select column_a,NULL as column_b from test_temp;

同样的事情在 Hive 中也有效,并创建了数据类型为“void”的列。

我使用空字符串而不是 NULL 来避免异常和新列获取字符串数据类型。

有没有更好的方法使用 spark sql 在 hive 表中插入空值?

2017-12-26 07:27:59 ERROR StandardImsLogger$:177 - org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.UnsupportedOperationException: Unknown field type: void
    at org.apache.hadoop.hive.ql.metadata.Hive.createTable(Hive.java:789)
    at org.apache.hadoop.hive.ql.metadata.Hive.createTable(Hive.java:746)
    at org.apache.spark.sql.hive.client.ClientWrapper$$anonfun$createTable$1.apply$mcV$sp(ClientWrapper.scala:428)
    at org.apache.spark.sql.hive.client.ClientWrapper$$anonfun$createTable$1.apply(ClientWrapper.scala:426)
    at org.apache.spark.sql.hive.client.ClientWrapper$$anonfun$createTable$1.apply(ClientWrapper.scala:426)
    at org.apache.spark.sql.hive.client.ClientWrapper$$anonfun$withHiveState$1.apply(ClientWrapper.scala:293)
    at org.apache.spark.sql.hive.client.ClientWrapper.liftedTree1$1(ClientWrapper.scala:239)
    at org.apache.spark.sql.hive.client.ClientWrapper.retryLocked(ClientWrapper.scala:238)
    at org.apache.spark.sql.hive.client.ClientWrapper.withHiveState(ClientWrapper.scala:281)
    at org.apache.spark.sql.hive.client.ClientWrapper.createTable(ClientWrapper.scala:426)
    at org.apache.spark.sql.hive.execution.CreateTableAsSelect.metastoreRelation$lzycompute$1(CreateTableAsSelect.scala:72)
    at org.apache.spark.sql.hive.execution.CreateTableAsSelect.metastoreRelation$1(CreateTableAsSelect.scala:47)
    at org.apache.spark.sql.hive.execution.CreateTableAsSelect.run(CreateTableAsSelect.scala:89)
    at org.apache.spark.sql.execution.ExecutedCommand.sideEffectResult$lzycompute(commands.scala:58)
    at org.apache.spark.sql.execution.ExecutedCommand.sideEffectResult(commands.scala:56)
    at org.apache.spark.sql.execution.ExecutedCommand.doExecute(commands.scala:70)
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$5.apply(SparkPlan.scala:132)
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$5.apply(SparkPlan.scala:130)
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:150)
    at org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:130)
    at org.apache.spark.sql.execution.QueryExecution.toRdd$lzycompute(QueryExecution.scala:56)
    at org.apache.spark.sql.execution.QueryExecution.toRdd(QueryExecution.scala:56)
    at org.apache.spark.sql.DataFrame.withCallback(DataFrame.scala:153)
    at org.apache.spark.sql.DataFrame.<init>(DataFrame.scala:145)
    at org.apache.spark.sql.DataFrame.<init>(DataFrame.scala:130)
    at org.apache.spark.sql.DataFrame$.apply(DataFrame.scala:52)
    at org.apache.spark.sql.SQLContext.sql(SQLContext.scala:829)

【问题讨论】:

  • select cast(NULL as string) ?
  • 谢谢@philantrovert。成功了

标签: hadoop apache-spark hive apache-spark-sql


【解决方案1】:

我找不到关于数据类型 void 的太多信息,但它看起来有点等同于我们在 Scala 中的 Any 数据类型。

at the end of this page 表说明 void 可以转换为任何其他数据类型。

这里有一些与您面临的问题有点相似的 JIRA 问题

因此,如评论中所述,您可以将其转换为任何隐式数据类型,而不是 NULL

select cast(NULL as string) as column_b

【讨论】:

    【解决方案2】:

    我开始遇到类似的问题。我将代码构建为一个示例

    WITH DATA
    AS (
      SELECT 1 ISSUE_ID,
             DATE(NULL) DueDate,
             MAKE_DATE(2000,01,01) DDate
      UNION ALL
      SELECT 1 ISSUE_ID,
             MAKE_DATE(2000,01,01),
             MAKE_DATE(2000,01,02)
    )
    SELECT ISNOTNULL(lag(IT.DueDate, 1) OVER (PARTITION by IT.ISSUE_ID ORDER BY IT.DDate ))
           AND ISNULL(IT.DueDate)
    FROM DATA IT
    

    【讨论】:

    • 你好约根!欢迎 :) 据我了解,您创建了一个 minimal, workable example (mwe),这太棒了!由于它不是对原始问题的回答,我建议将此作为评论,或者更好的是,通过提出编辑将其贡献给问题本身。
    猜你喜欢
    • 2019-06-06
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 2021-05-08
    • 1970-01-01
    相关资源
    最近更新 更多