我们可以直接将 Parquet 文件加载到 Hive 中吗?

Posted

技术标签:

【中文标题】我们可以直接将 Parquet 文件加载到 Hive 中吗?【英文标题】:Can we load Parquet file into Hive directly? 【发布时间】:2016-03-22 01:53:20 【问题描述】:

我知道我们可以使用 Spark SQL 和 Impala 加载 parquet 文件,但想知道我们是否可以使用 Hive 来做同样的事情。我已经阅读了很多文章,但我仍然感到困惑。

简单地说,我有一个镶木地板文件 - 比如说 users.parquet。现在,我对如何将 users.parquet 中的数据加载/插入/导入配置单元(显然是表)感到震惊。

如果我遗漏了一些明显的东西,请建议或指出正确的方向。

Creating hive table using parquet file metadata

https://phdata.io/examples-using-textfile-and-parquet-with-hive-and-impala/

【问题讨论】:

我对 ORC 文件所做的一个技巧(实际上是将 Prod 表克隆到测试集群中):创建一个具有相同结构的非分区表;将数据文件复制到新表使用的目录; ,表格已填充。也可以与 Parquet 一起使用。 【参考方案1】:

使用 parquet 工具获取 parquet 文件的架构,详情请查看链接http://kitesdk.org/docs/0.17.1/labs/4-using-parquet-tools-solution.html

并使用文件顶部的架构构建表,详情请查看Create Hive table to read parquet files from parquet/avro schema

【讨论】:

【参考方案2】:

获取架构至关重要,因为您必须首先在 Hive 中创建具有适当架构的表,然后将其指向 parquet 文件。

我遇到了类似的问题,我在一个 VM 中有数据,必须将其移动到另一个 VM。这是我的演练:

    了解原始 Parquet 文件是(位置和架构): describe formatted users;show create table users; 后者将立即为您提供架构,并为您指出 HDFS 的位置hdfs://hostname:port/apps/hive/warehouse/users

    了解您的表分区show partitions users;

    将表的 Parquet 文件从 HDFS 复制到本地目录

    hdfs dfs -copyToLocal /apps/hive/warehouse/users
    

    将它们移到其他集群/VM 或您希望它们去的地方

    使用相同的架构在目标CREATE USERS ... 上创建用户表

    CREATE TABLE users ( name string, ... )
    PARTITIONED BY (...)
    STORED AS PARQUET;
    

    现在,将 Parquet 文件移动到相应文件夹中(如果需要,请了解您刚刚创建的表的位置)

    hdfs dfs -ls /apps/hive/warehouse/users/
    hdfs dfs -copyFromLocal ../temp/* /apps/hive/warehouse/
    

    对于每个分区,您必须将 Hive 指向相应的子目录:alter table users add partition (sign_up_date='19991231') location '/apps/hive/warehouse/users/sign_up_date=19991231';(您可能希望使用 bash 脚本执行此操作)

这对我有用,希望对你有帮助。

【讨论】:

我使用了同样的管道,编码为 python ELT 管道。【参考方案3】:

不知道它是否有点“hacky”,但我使用的是 zeppelin(与 ambari 一起提供)。您可以简单地结合 spark2 执行以下操作:

%spark2
import org.apache.spark.sql.SaveMode

var df = spark.read.parquet("hdfs:///my_parquet_files/*.parquet");
df.write.mode(SaveMode.Overwrite).saveAsTable("imported_table")

这种方式的优点是您还可以导入许多 parquet 文件,即使它们具有不同的架构。

【讨论】:

我相信,上面的方法是创建配置单元管理表而不是外部表。 你能告诉我们完整的代码吗?我不知道在这段代码中在哪里设置蜂巢连接 我的答案 js 从 2017 年开始,同时可能是很多东西在 spark 中发生了变化,但如果我没记错的话,如果你像我写的那样使用 zeppelin,你不需要设置连接(你可以使用解释器设置等)..如果您不使用 zeppelin,请搜索设置 hive 连接,因为我不是最新的 spark/hive 版本【参考方案4】:

你可以试试这个...导出/导入适用于所有类型的文件格式,包括 Hive 中的镶木地板。这是一般概念,您可以根据您的要求进行一些调整,例如从本地(或)跨集群加载

注意:当你执行单个步骤时,你可以硬编码而不是 $,当你从脚本运行它时,也可以传递“HDFS 路径”、“架构”和“表名”作为参数。因此,您只需传递参数即可导出/导入无限表

步骤一: hive -S -e "导出表$schema_file1.$tbl_file1到'$HDFS_DATA_PATH/$tbl_file1';" # -- 从 HDFS 执行。 Step2: # -- 它包含数据和元数据。将其压缩并 scp 到目标集群 Step3: hive -S -e "import table $schema_file1.$tbl_file1 from '$HDFS_DATA_PATH/$tbl_file1';" # -- 第一次导入会报错,因为表不存在,但会自动创建表 Step4: hive -S -e "import table $schema_file1.$tbl_file1 from '$HDFS_DATA_PATH/$tbl_file1';" # -- 第二次导入将无任何错误的数据导入为现在可用的表

谢谢

库马尔

【讨论】:

以上是关于我们可以直接将 Parquet 文件加载到 Hive 中吗?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以直接从文件加载镶木地板?

hive使用parquet及压缩数据大小前后对比

将 Parquet 文件从 AWS Glue 加载到 Redshift

从 parquet 文件将具有默认值的数据加载到 Redshift

使用复制命令和清单文件将 parquet 格式文件加载到 Amazon Redshift 时出错

如何将 txt 文件转换为 parquet 文件并将其加载到 hdfs table-pyspark