【问题标题】:Java Spark insert JSON into table data type mismatchJava Spark 将 JSON 插入到表数据类型不匹配中
【发布时间】:2018-02-07 16:51:25
【问题描述】:

我通过以下方式将我的 JSON 插入 Hive:

Dataset<Row> jsonData = spark.read().json("file:///root/jsonData.json");

//In reality this table has more columns, I made it shorter for the sake of readability    
spark.sql("CREATE TABLE table1 ( \n" +
            "`test_name` string, \n" +
            "`test_timestamp` timestamp, \n" +
            "`test_id` string");

jsonData.write().insertInto(table1);

执行此操作后,我在线程“main”org.apache.spark.sql.AnalysisException 中收到以下异常:由于数据类型不匹配,无法解析“CAST(test_name AS test_id)”。

我的猜测是出现此问题是因为我的 JSON 中的实体的顺序与我创建的列的顺序不同,如下所示。

以前我是这样做的:

Dataset<Row> jsonData = spark.read().json("file:///root/jsonData.json");
jsonData.createOrReplaceTempView("jsonDataTable");
Dataset<Row> showAll = spark.sql("SELECT * FROM jsonDataTable");

//Save as table jsonDataTable with overwrite 
showAll.write().mode("overwrite").saveAsTable("jsonDataTable");
showAll.show();

下面的解决方案非常好,因为它会从我的 JSON 自动创建一个表,它的问题是它将所有 COLUMN TYPE 设置为字符串、结构或数组,但在某些情况下我想指定时间戳等。

我需要帮助先以某种方式创建一个表,然后在顺序无关紧要的地方插入 JSON(它不能不匹配吗?test_name -> 转到 test_name 等?)。

非常欢迎其他建议 - 目的是创建一个我指定 COLUMN TYPE 并插入 JSON 数据的表。

【问题讨论】:

  • @cricket_007 在这里标记你,我敢打赌你知道一个优雅的简单解决方案来解决我的问题。
  • 样本数据????
  • @Bala 完全有效且经过验证的 JSON,实际上并没有什么特别之处。数据不是问题:/

标签: java apache-spark hive


【解决方案1】:

下面(在 pyspark 中)应该会给你一些想法。我用过 Spark 1.6

data4.json

{"name":"Spark","id":"10"}
{"name":"Hive","id":"5"}

加载json,看到两列都是字符串

>>> sqlContext.read.json("data4.json").printSchema()
root
 |-- id: string (nullable = true)
 |-- name: string (nullable = true)

>>> sqlContext.read.json("data4.json").show()
+---+-----+
| id| name|
+---+-----+
| 10|Spark|
|  5| Hive|
+---+-----+

将列 id 数据类型更改为 long 并保存到表 t3

>>> sqlContext.read.json("data4.json").withColumn("id", col("id").cast("long")).saveAsTable("t3")

>>> sqlContext.read.table("t3").printSchema()                                   
root
 |-- id: long (nullable = true)
 |-- name: string (nullable = true)

【讨论】:

    猜你喜欢
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多