我知道我们可以使用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/
答案 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中创建具有相应模式的表,然后将其指向镶木地板文件。
我有一个类似的问题,我在一个虚拟机中有数据,不得不将其移动到另一个虚拟机。这是我的演练:
了解原始的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脚本执行此操作)
这对我有用,希望它有所帮助。
答案 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"从脚本运行它时的参数。因此,只需传递参数
即可导出/导入无限制的表谢谢
库马尔