我对Hive很新,我正在处理下面的问题,但我无法解决它。请帮帮我。
我有以下类型的json记录。
td {
vertical-align: top;
min-width: 150px;
height:1;
}
我想取消嵌套或转换如下。
{"issues":[{"key":"COV-2073","labels":[ "java","db"]}]}
我使用了以下类型的查询,但我无法获得所需的输出。
Key labels
"COV-2073" "java","db"
即使我也可以使用以下类型的输出。
select v2.key from demo_example as d lateral view json_tuple(d.a1,'issues') v1 as issue lateral view json_tuple(v1.issue,'key') v2 as key;
请帮我解决上面的问题。
答案 0 :(得分:1)
以下是SparkSQL中的一个示例
end_queue
当某些json行没有特定列的值时,如果您想显示//data.json
{"name":"John","age":"30","cars": [{ "name":"Ford", "models":["Fiesta", "Focus", "Mustang"]}, {"name":"BMW", "models":["320", "X3", "X5"]}, {"name":"Fiat", "models":["500", "Panda"]}]}
//SparkSQL
>>> sqlContext.sql("""select name,age,col1.name, col2 from json.`data.json` lateral view explode(cars) v1 as col1 lateral view explode(col1.models) v2 as col2""").show()
+----+---+----+-------+
|name|age|name| col2|
+----+---+----+-------+
|John| 30|Ford| Fiesta|
|John| 30|Ford| Focus|
|John| 30|Ford|Mustang|
|John| 30| BMW| 320|
|John| 30| BMW| X3|
|John| 30| BMW| X5|
|John| 30|Fiat| 500|
|John| 30|Fiat| Panda|
+----+---+----+-------+
,请使用NULL
代替lateral view outer
。
作为一个例子,下面的json有2个条目,一个包含所有细节,一个没有汽车,模型等。
lateral view
在这种情况下,使用外部生成{"name":"John","age":"30","cars": [{ "name":"Ford", "models":["Fiesta", "Focus", "Mustang"]}, {"name":"BMW", "models":["320", "X3", "X5"]}, {"name":"Fiat", "models":["500", "Panda"]}]}
{"name":"Dough","age":"90"}
作为条目null
Dough
如果您希望所有模型都是数组,那么
>>> sqlContext.sql("""select name,age,col1.name, col2 from json.`data.json` lateral view outer explode(cars) v1 as col1 lateral view outer explode(col1.models) v2 as col2 order by col2""").show()
+-----+---+----+-------+
| name|age|name| col2|
+-----+---+----+-------+
|Dough| 90|null| null|
| John| 30| BMW| 320|
| John| 30|Fiat| 500|
| John| 30|Ford| Fiesta|
| John| 30|Ford| Focus|
| John| 30|Ford|Mustang|
| John| 30|Fiat| Panda|
| John| 30| BMW| X3|
| John| 30| BMW| X5|
+-----+---+----+-------+
答案 1 :(得分:0)
您可以使用cloudera的Hive JSON serde来解析JSON并将其加载为CSV。您可以从here下载Serde。将jar添加到Hive classPath或hive终端。
然后您可以创建一个hive表格作为
CREATE TABLE TEST(issues ARRAY<STRUCT<key:STRING,labels:STRING>>) ROW FORMAT SERDE 'com.cloudera.hive.serde.JSONSerDe';
现在将数据加载到表中并进行测试。现在将您的select语句写为
select issues.key,issues.labels from TEST;
您将获得所需的输出
["COV-2073"] ["[java, db]"]