【问题标题】:How to load json snappy compressed in HIVE如何加载在 HIVE 中压缩的 json snappy
【发布时间】:2021-01-28 20:46:13
【问题描述】:

我在 HDFS 中有一堆 json snappy 压缩文件。 它们是 HADOOP snappy 压缩的(不是 python,参见其他 SO 问题) 并且有嵌套结构。

找不到加载它们的方法 进入 HIVE(使用 json_tuple)?

我可以获得一些关于如何加载它们的资源/提示

以前的参考资料(没有有效答案)

pyspark how to load compressed snappy file

Hive: parsing JSON

【问题讨论】:

  • 您可以使用 spark 加载 snappy 压缩文件并写入 hive 表.. 这不起作用吗?
  • 不,我没有足够大的火花。需要使用HIVE
  • 好的,您可以使用与 json snappy 文件相同的模式创建一个带有 json serde 的外部表。

标签: json apache-spark hadoop hive snappy


【解决方案1】:
  1. 将所有文件放入 HDFS 文件夹并在其上创建外部表。如果文件具有 .snappy 之类的名称,Hive 将自动识别它们。您可以为写表指定SNAPPY输出格式:

set hive.exec.compress.output=true;
set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
set mapreduce.output.fileoutputformat.compress.type=BLOCK;
 


CREATE EXTERNAL TABLE mydirectory_tbl(
  id   string,
  name string
)
ROW FORMAT SERDE
  'org.openx.data.jsonserde.JsonSerDe'
LOCATION '/mydir' --this is HDFS/S3 location
;
  1. JSONSerDe 可以解析所有复杂的结构,比使用 json_tuple 容易得多。 json中的简单属性按原样映射到列中方括号[]中的都是array,{}中是struct或map,复杂类型可以嵌套。仔细阅读自述文件:https://github.com/rcongiu/Hive-JSON-Serde。有一节介绍嵌套结构和许多 CREATE TABLE 示例。

  2. 如果您仍想使用 json_tuple,则创建具有单个 STRING 列的表,然后使用 json_tuple 进行解析。但这要困难得多。

  3. 所有 JSON 记录都应该在单行中(JSON 对象内没有换行符,以及 \r)。这里也提到了https://github.com/rcongiu/Hive-JSON-Serde

【讨论】:

  • 部分是启用json snappy reading is TableProperties ?
  • 读取 snappy 是否需要 json serde(是或否)?无法在我的环境中安装外部 jar。
  • @quantCode 如果文件是 CSV、TSV、ctrl_A 分隔的,则不需要。 JSONSerDe 只需要读取 JSON。用 SNAPPY 压缩或不压缩都没有关系。如果需要读取 JSON 而无法添加 JAR,可以尝试原生 Hive JSONSerDe : 'org.apache.hive.hcatalog.data.JsonSerDe'。它应该已经安装了。在此处阅读更多详细信息:docs.aws.amazon.com/athena/latest/ug/json-serde.html
  • @quantCode SNAPPY 是一种压缩编解码器。 Hive 原生可以压缩和解压 SNAPPY。压缩编解码器和 JSON 没有任何共同之处。 CSV 文件也可以使用 SNAPPY 进行压缩。
  • 好的,谢谢。我的主要问题是压缩 json 的活泼部分。
【解决方案2】:

如果您的数据已分区(例如按日期)

在 Hive 中创建表

CREATE EXTERNAL TABLE IF NOT EXISTS database.table (
  filename STRING,
  cnt BIGINT,
  size DOUBLE
) PARTITIONED BY (   \`date\` STRING ) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'  
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 'folder/path/in/hdfs'

恢复分区(恢复前,表好像是空的)

MSCK REPAIR TABLE database.table

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-09
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多