如何将数据数组导入到配置单元表中的单独行中?

siv3szwd  于 2021-06-01  发布在  Hadoop
关注(0)|答案(2)|浏览(296)

我正在尝试将以下格式的数据导入配置单元表

[
    {
      "identifier" : "id#1",
      "dataA" : "dataA#1"
    },
    {
      "identifier" : "id#2",
      "dataA" : "dataA#2"
    }
]

我有多个这样的文件,我希望每个{}在表中形成一行。这就是我尝试过的:

CREATE EXTERNAL TABLE final_table(
    identifier STRING,
    dataA STRING
) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION "s3://bucket/path_in_bucket/"

不过,这并不是为每个{}创建一行。我也试过了

CREATE EXTERNAL TABLE final_table(
    rows ARRAY< STRUCT<
    identifier: STRING,
    dataA: STRING
    >>
) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION "s3://bucket/path_in_bucket/"

但这也不管用。是否有某种方法可以将输入指定为一个数组,每个记录都是配置单元查询数组中的一个项?有什么建议吗?

liwlm1x9

liwlm1x91#

数据文件中的json记录必须每行显示一条,空行将生成空记录。
这个json应该可以工作
{“identifier”:“id#1”,“dataa”:“dataa#1”},{“identifier”:“id#2”,“dataa”:“dataa#2”}

bvn4nwqk

bvn4nwqk2#

这是你需要的
方法1:向数组中添加名称
数据

{"data":[{"identifier" : "id#1","dataA" : "dataA#1"},{"identifier" : "id#2","dataA" : "dataA#2"}]}

sql语句

SET hive.support.sql11.reserved.keywords=false;

CREATE EXTERNAL TABLE IF NOT EXISTS ramesh_test (
  data array<
    struct<
      identifier:STRING, 
      dataA:STRING
    >
  >
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 'my_location';

SELECT rows.identifier,
       rows.dataA
  FROM ramesh_test d
LATERAL VIEW EXPLODE(d.data) d1 AS rows  ;

输出

方法2-数据无变化
数据

[{"identifier":"id#1","dataA":"dataA#1"},{"identifier":"id#2","dataA":"dataA#2"}]

sql语句

CREATE EXTERNAL TABLE IF NOT EXISTS ramesh_raw_json (
  json STRING
)
LOCATION 'my_location';

SELECT get_json_object (exp.json_object, '$.identifier') AS Identifier,
       get_json_object (exp.json_object, '$.dataA') AS Identifier
  FROM ( SELECT json_object
           FROM ramesh_raw_json a
           LATERAL VIEW EXPLODE (split(regexp_replace(regexp_replace(a.json,'\\}\\,\\{','\\}\\;\\{'),'\\[|\\]',''), '\\;')) json_exploded AS json_object ) exp;

输出

相关问题