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

Can we load Parquet file into Hive directly?

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

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

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

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

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

并使用文件顶部的架构构建 table,有关详细信息,请查看

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

我有一个类似的问题,我在一个 VM 中有数据并且不得不将它移动到另一个。这是我的演练:

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

  2. 了解您的 table show partitions users;

  3. 的分区
  4. 将 table 的 Parquet 文件从 HDFS 复制到本地目录

    hdfs dfs -copyToLocal /apps/hive/warehouse/users
    
  5. 将它们移到另一个 cluster/VM 或您希望它们去的地方

  6. 使用相同的架构

    在目标 CREATE USERS ... 上创建用户 table
    CREATE TABLE users ( name string, ... )
    PARTITIONED BY (...)
    STORED AS PARQUET;
    
  7. 现在,将 Parquet 文件移动到相应的文件夹中(如果需要,找出您刚刚创建的 table 的位置)

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

这对我有用,希望对您有所帮助。

您可以试试这个... export/import 适用于所有类型的文件格式,包括 Hive 中的 parquet。这是一般概念,您可以根据您的要求进行一些调整,例如来自本地(或)跨集群的负载

注意:当你执行单个步骤时,你可以硬编码而不是 $,当你 运行从脚本。所以你可以 export/import 无限 table 只需传递参数

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

谢谢

库马尔

不知道是不是有点"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 文件,即使它们具有不同的架构。