将hson数据转换为hive中的正常行

时间:2018-01-25 11:44:20

标签: json hadoop hive

我对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;

请帮我解决上面的问题。

2 个答案:

答案 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]"]