我将以下列方式将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数据。
答案 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)