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

时间:2015-12-16 03:16:26

标签: hadoop hive apache-spark-sql hiveql parquet

我知道我们可以使用Spark SQL加载镶木地板文件并使用Impala但是想知道我们是否可以使用Hive来做同样的事情。我一直在阅读很多文章,但我仍然感到困惑。

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

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

Creating hive table using parquet file metadata

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

4 个答案:

答案 0 :(得分:8)

使用镶木地板工具获取镶木地板文件的架构,有关详细信息,请查看链接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

答案 1 :(得分:7)

获取模式至关重要,因为您必须先在Hive中创建具有相应模式的表,然后将其指向镶木地板文件。

我有一个类似的问题,我在一个虚拟机中有数据,不得不将其移动到另一个虚拟机。这是我的演练:

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

  2. 了解表show partitions users;

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

    hdfs dfs -copyToLocal /apps/hive/warehouse/users
    
  5. 将它们移动到其他群集/ VM或您希望它们到达的位置

  6. 使用相同的架构

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

    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脚本执行此操作)

  9. 这对我有用,希望它有所帮助。

答案 2 :(得分: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")

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

答案 3 :(得分:0)

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

注意:执行单个步骤时,您可以使用硬编码代替$,也可以通过" HDFS路径",#34; Schema"和" tablename"从脚本运行它时的参数。因此,只需传递参数

即可导出/导入无限制的表
  • 第1步: hive -S -e"导出表$ schema_file1。$ tbl_file1到' $ HDFS_DATA_PATH / $ tbl_file1&#39 ;;" # - 从HDFS执行。
  • 第2步: # - 它包含数据和元数据。将它和scp压缩到目标群集
  • 第3步: hive -S -e"导入表$ schema_file1。$ tbl_file1来自' $ HDFS_DATA_PATH / $ tbl_file1&#39 ;;" # - 首次导入会因为表格不存在而导致错误,但会自动创建表格
  • 步骤4: hive -S -e"从$ HDFS_DATA_PATH / $ tbl_file1';"导入表$ schema_file1。$ tbl_file1 # - 第二次导入将导入数据而不会出现任何错误,如现在可用的表

谢谢

库马尔