【问题标题】:Insert NULL values into Hive with dataFrame in Spark在 Spark 中使用 dataFrame 将 NULL 值插入 Hive
【发布时间】:2017-11-29 04:19:53
【问题描述】:

我正在尝试将值插入 Hive 表,如果每一列都有一个值,则没有问题,但我需要在其中一列中插入 NULL 值。 我就是这样做的:

val errorsToAlert = List(("source1", "table1","27-01-2002", null))
val data = sqlContext.createDataFrame(errorsToAlert).toDF("source", 
"table_name", "open_date", "close_date")
data.write.mode("append").saveAsTable("management.alerts")

我尝试过使用 NULL 和 None,但都表示这个错误:

17/06/26 11:59:38 错误 yarn.ApplicationMaster: 用户类抛出 例外:
scala.MatchError:scala.None.type(类 scala.reflect.internal.Types$UniqueSingleType)
scala.MatchError:scala.None.type(类 scala.reflect.internal.Types$UniqueSingleType)

【问题讨论】:

  • 那是因为您的数据中只有一行 close_date 为 null,它被视为 None 类型而不是 StringType。您必须明确定义架构或在 close_date 列中添加另一行非空值。

标签: scala apache-spark dataframe hive insert


【解决方案1】:

该问题与 Hive 完全无关。如果您检查errorsToAlert 的类型,您会看到它是:

List[(String, String, String, Null)]

并且scala.Null 不是Dataset 可接受的输入。

如果所需类型本身可以为空,您可以显式指定它:

sqlContext.createDataFrame(Seq(
  ("source1", "table1","27-01-2002", null: String)
))

否则使用scala.Option:

sqlContext.createDataFrame(Seq(
  ("source1", "table1","27-01-2002", None: Option[Int])
))

【讨论】:

  • 我认为“close_date”的类型不是Int(你的最后一行)
  • @RaphaelRoth 公平点,但Strings 和支持的java.sql 类型都包含在第一种情况下,所以这主要是为了完整性。
猜你喜欢
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多