我们可以直接将 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 中有数据并且不得不将它移动到另一个。这是我的演练:
了解有关原始 Parquet 文件的信息(位置和架构):
describe formatted users;
和 show create table users;
后者会立即为您提供架构,并指向 HDFS 的位置 hdfs://hostname:port/apps/hive/warehouse/users
了解您的 table show partitions users;
的分区
将 table 的 Parquet 文件从 HDFS 复制到本地目录
hdfs dfs -copyToLocal /apps/hive/warehouse/users
将它们移到另一个 cluster/VM 或您希望它们去的地方
使用相同的架构
在目标 CREATE USERS ...
上创建用户 table
CREATE TABLE users ( name string, ... )
PARTITIONED BY (...)
STORED AS PARQUET;
现在,将 Parquet 文件移动到相应的文件夹中(如果需要,找出您刚刚创建的 table 的位置)
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 脚本执行此操作)
这对我有用,希望对您有所帮助。
您可以试试这个... 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 文件,即使它们具有不同的架构。
我知道我们可以使用 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 中有数据并且不得不将它移动到另一个。这是我的演练:
了解有关原始 Parquet 文件的信息(位置和架构):
describe formatted users;
和show create table users;
后者会立即为您提供架构,并指向 HDFS 的位置hdfs://hostname:port/apps/hive/warehouse/users
了解您的 table
show partitions users;
的分区
将 table 的 Parquet 文件从 HDFS 复制到本地目录
hdfs dfs -copyToLocal /apps/hive/warehouse/users
将它们移到另一个 cluster/VM 或您希望它们去的地方
使用相同的架构
在目标CREATE USERS ...
上创建用户 tableCREATE TABLE users ( name string, ... ) PARTITIONED BY (...) STORED AS PARQUET;
现在,将 Parquet 文件移动到相应的文件夹中(如果需要,找出您刚刚创建的 table 的位置)
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 脚本执行此操作)
这对我有用,希望对您有所帮助。
您可以试试这个... 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 文件,即使它们具有不同的架构。