Java Spark将JSON插入表数据类型不匹配

时间:2018-02-07 16:51:25

标签: java apache-spark hive

我将以下列方式将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);

一旦我执行了这个,我在线程&#34; main&#34;中得到以下异常。 org.apache.spark.sql.AnalysisException:无法解析&#39; CAST(test_name AS test_id)&#39;由于数据类型不匹配。

我的猜测是发生此问题,因为我的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 - &gt;转到test_name等?)。< / p>

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

1 个答案:

答案 0 :(得分:0)

下面(在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)