【问题标题】:Can we load Parquet file into Hive directly?我们可以直接将 Parquet 文件加载到 Hive 中吗?
【发布时间】: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 一起使用。

标签: hadoop hive apache-spark-sql hiveql 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。这是我的演练:

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

    2. 了解您的表分区show partitions users;

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

      hdfs dfs -copyToLocal /apps/hive/warehouse/users
      
    4. 将它们移到其他集群/VM 或您希望它们去的地方

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

      CREATE TABLE users ( name string, ... )
      PARTITIONED BY (...)
      STORED AS PARQUET;
      
    6. 现在,将 Parquet 文件移动到相应文件夹中(如果需要,请了解您刚刚创建的表的位置)

      hdfs dfs -ls /apps/hive/warehouse/users/
      hdfs dfs -copyFromLocal ../temp/* /apps/hive/warehouse/
      
    7. 对于每个分区,您必须将 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';" # -- 第二次导入将无任何错误的数据导入为现在可用的表

    谢谢

    库马尔

    【讨论】:

      猜你喜欢
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 2016-08-06
      • 1970-01-01
      • 2020-02-01
      • 2017-05-27
      • 1970-01-01
      相关资源
      最近更新 更多