arrays - 如何将数据数组导入到 Hive 表中的单独行中?

标签 arrays hadoop hive create-table hive-serde

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

[
    {
      "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/"

但这也行不通。是否有某种方法可以将输入指定为数组,其中每个记录都是 hive 查询数组中的一个项目?有什么建议吗?

最佳答案

这就是您所需要的

方法一:将名称添加到数组

数据

{"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  ;

输出

enter image description here

方法 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;

输出

enter image description here

关于arrays - 如何将数据数组导入到 Hive 表中的单独行中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47522270/

相关文章:

javascript - 为什么我的数组过滤器返回 'undefined is not a function' ?

objective-c - 当我尝试在函数中返回此数组时,为什么会出现错误 "Array initializer must be an initializer list"?

c - 从文件中读取一串信息并按int结果排序

hadoop - Hive 不支持存在。如何编写以下查询?

azure - 在 HDInsight 上使用 HQL 文件时出现 ParseException

HIVE> 失败 : SemanticException Line 1:23 Invalid path

sql - 如何在Hiveql中以递归方式生成数字序列?

ios - 无法将数组名称传递到 Swift 3 中的 TableView

hadoop - 在hadoop流中,我可以将文件写入到reducer的本地光盘中吗?

amazon-web-services - 避免在 EMR 集群中运行 Install Task Runner 步骤