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

26

我知道我们可以使用Spark SQL和Impala加载parquet文件,但想知道是否可以使用Hive进行相同操作。我看了很多文章,但还是感到困惑。

简单来说,我有一个parquet文件——比方说叫做users.parquet。现在我卡在这里,不知道如何将users.parquet中的数据加载/插入/导入到Hive(显然是要插入到表中)。

如果我漏掉了一些显而易见的东西,请给予建议或指点方向。

使用parquet文件元数据创建Hive表

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


1
我在ORC文件上做的一个技巧(实际上是将生产表克隆到测试集群):创建一个与原表结构完全相同的非分区表;将数据文件复制到新表使用的目录中;哇啦,表就被填充了。这个方法也可能适用于Parquet。 - Samson Scharfrichter
4个回答

14

11

获取架构非常重要,因为你需要在Hive中首先使用适当的架构创建表,然后将其指向parquet文件。

我有一个类似的问题,我需要将数据从一个虚拟机移动到另一个虚拟机。以下是我的步骤:

  1. 了解原始Parquet文件的位置和架构: describe formatted users;show create table users; 后者可以让您立即获得模式,并指向HDFS的位置 hdfs://hostname:port/apps/hive/warehouse/users

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

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

  4. hdfs dfs -copyToLocal /apps/hive/warehouse/users
    
  5. 将它们移动到另一个集群/虚拟机或您想让它们去的地方

  6. 在目标位置上使用相同的模式创建用户表CREATE USERS ...

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

  9. hdfs dfs -ls /apps/hive/warehouse/users/
    hdfs dfs -copyFromLocal ../temp/* /apps/hive/warehouse/
    
  10. 对于每个分区,您都需要将Hive指向相应的子目录:alter table users add partition (sign_up_date='19991231') location '/apps/hive/warehouse/users/sign_up_date=19991231';(您可能想使用bash脚本完成此操作)

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


我使用了同样的流程,编写成了 Python ELT 流水线。 - Vitalis

6

不确定是否有些"hacky",但我使用的是Ambari中捆绑的Zeppelin。您可以与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文件。

我相信,上述方法创建的是Hive托管表而不是外部表。 - soMuchToLearnAndShare
你能展示完整的代码吗?我不知道在这个代码中应该在哪里设置hive连接。 - yuzhen
我的答案是来自2017年的js,与此同时,可能在spark中发生了很多变化,但如果我记得正确的话,如果您像我写的那样使用zeppelin,您不需要设置连接(您可以使用解释器设置等)。如果您不使用zeppelin,请搜索设置hive连接,因为我对最新的spark / hive版本不是很了解。 - Fabian

0
你可以尝试这个... 导出/导入适用于包括Hive中的parquet在内的所有文件格式。这是一个通用的概念,你可以根据自己的需求进行微调,比如从本地加载或跨集群加载。
注意:当你执行单个步骤时,你可以硬编码而不是使用$,同时在运行脚本时将"HDFS路径"、"模式"和"表名"作为参数传递。因此,你只需通过传递参数就可以无限制地导出/导入表格。
  • 步骤1:hive -S -e "将表 $schema_file1.$tbl_file1 导出到 '$HDFS_DATA_PATH/$tbl_file1';" # -- 从HDFS执行.
  • 步骤2:# -- 它包含数据和元数据。将其压缩并scp到目标集群
  • 步骤3:hive -S -e "从 '$HDFS_DATA_PATH/$tbl_file1' 导入表 $schema_file1.$tbl_file1;" # -- 第一次导入会报错,因为表不存在,但会自动创建一个表
  • 步骤4:hive -S -e "从 '$HDFS_DATA_PATH/$tbl_file1' 导入表 $schema_file1.$tbl_file1;" # -- 第二次导入将在有表的情况下无错误地导入数据

谢谢

Kumar


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接