在 Hive 表 hdfs 文件夹中写入文件并使其可用于从 Hive 查询

Posted

技术标签:

【中文标题】在 Hive 表 hdfs 文件夹中写入文件并使其可用于从 Hive 查询【英文标题】:Write files inside Hive table hdfs folder and make them available to be queried from Hive 【发布时间】:2018-06-06 09:17:28 【问题描述】:

我使用的是 Spark 2.2.1,它有一个有用的选项来指定我想在文件的每个分区中保存多少条记录;此功能允许在写入文件之前避免重新分区。 但是,似乎此选项仅可用于 FileWriter 接口而不是 DataFrameWriter 接口: 这样选项就被忽略了

df.write.mode("overwrite")
  .option("maxRecordsPerFile", 10000)
 .insertInto(hive_table)

虽然它以这种方式工作

df.write.option("maxRecordsPerFile", 10000)
  .mode("overwrite").orc(path_hive_table)

所以我是直接在指定表的HiveMetastore文件夹中写入orc文件。问题是如果我在插入后查询 Hive 表,则 Hive 无法识别此数据。 你知道是否有办法在 hive 元存储中直接写入分区文件并通过 Hive 表使它们也可用?

【问题讨论】:

【参考方案1】:

调试步骤:

1 .检查您的配置单元表使用的文件类型

Show create table table_name

并检查“存储为”.. 为了提高效率,将您的输出保存在镶木地板和分区位置(您可以在上述查询的“位置”中看到)..如果有任何其他特定类型,请创建该类型的文件。

2 。如果您在任何分区中保存数据并手动创建分区文件夹,请避免这种情况。使用

创建分区
alter table table_name add partition (partition_column=value);

3 . 在 spark 中创建输出文件后.. 您可以重新加载这些文件并检查“_corrupt_record”(您可以打印数据帧并检查此内容)

【讨论】:

我将文件创建为“orc”,这是 STORED AS 告诉我的;然后我尝试使用“更改表添加分区”加载到配置单元中,但是当我查询数据时,我得到一个 ClassCastException Caused by: java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache。 hadoop.hive.serde2.io.TimestampWritable 您的数据与 hive 列的数据类型之间似乎存在数据类型不匹配【参考方案2】:

除此之外,我还发现命令“MSCK REPAIR TABLE”会自动发现 hive 表文件夹中的新分区

【讨论】:

以上是关于在 Hive 表 hdfs 文件夹中写入文件并使其可用于从 Hive 查询的主要内容,如果未能解决你的问题,请参考以下文章

spark利用sparkSQL将数据写入hive两种通用方式实现及比较

spark利用sparkSQL将数据写入hive两种通用方式实现及比较

flink写入hdfs

从 hdfs 中删除文件是不是会删除相应的 hive 外部表分区?

将数据加载到 Hive/Impala

从 HIVE 表加载到 HDFS 作为 AVRO 文件