【问题标题】:How do I import an array of data into separate rows in a hive table?如何将数据数组导入配置单元表中的单独行?
【发布时间】:2018-05-11 08:39:45
【问题描述】:

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

[
    {
      "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 查询的数组中的一个项目?有什么建议吗?

【问题讨论】:

    标签: arrays hadoop hive create-table hive-serde


    【解决方案1】:

    数据文件中的 JSON 记录必须每行出现一个,空行将产生 NULL 记录。

    这个 json 应该可以工作

    { “标识符”:“id#1”,“dataA”:“dataA#1”}, { "标识符" : "id#2", "dataA" : "dataA#2" }

    【讨论】:

    • 我提交的 json 格式是为了便于阅读。如果你的意思是摆脱 [ ] 那么我有 11672 个文件,是否有一些选项可以指定每个文件都是一个数组,这就是我要问的
    • 您能否提供一个示例预期输出以便更好地理解
    • 预期输出是一个 hive 表,数组中的每个项目都作为表中的一行
    • 两年后我在stackoverflow.com/questions/61969182/… 也有同样的问题。太糟糕了,这里建议的解决方案都没有产生您想要的结果,所以我也可以这样做。
    【解决方案2】:

    这是你需要的

    方法一:给数组添加名字

    数据

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

    输出

    【讨论】:

    • 这需要修改为{"data":}。我想知道是否有什么方法可以做到这一点,而无需修改现有数据。
    • @shrewquest - 如果您不想命名数组对象,那么我认为您将不得不分解数组并使用 get_json_object 来获取值。根据我的经验,这在性能方面是混乱和缓慢的。我的建议是创建一个临时表以将名称连接到数组对象。您可以在 UNIX 脚本中执行此操作,也可以在 Hive 本身中使用临时表执行此操作。
    • @shrewquest - 使用不需要更改数据的方法 2 更新了答案。希望这会有所帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多