如何使用 spark 的通配符运行 LOAD DATA INPATH hive 命令?

Posted

技术标签:

【中文标题】如何使用 spark 的通配符运行 LOAD DATA INPATH hive 命令?【英文标题】:How to run LOAD DATA INPATH hive command with wildcard from spark? 【发布时间】:2020-07-17 04:24:11 【问题描述】:

我正在创建如下数据框:

from pyspark.sql import SparkSession, functions as f
from pyspark.sql.types import StructType, StructField, DataType, IntegerType, StringType
schma = StructType([
    StructField("id", IntegerType(), True),
    StructField("name",StringType(), True),
]
)
empdf=spark.read.format("csv").csv("/home/hdfs/sparkwork/hiveproj/Datasets/empinfo/emp.csv",schema=schma);
empdf.show();

我将数据框保存为镶木地板文件。

empdf.write.parquet(path="/home/hdfs/sparkwork/hiveproj/Data/empinfo/empl_par/")

如果我在 LOAD DATA INPATH 命令中使用特定的文件名,那么它工作正常。

spark.sql("LOAD DATA INPATH '/home/hdfs/sparkwork/hiveproj/Data/empinfo/empl_par/part-00000-6cdfcba5-49ab-499c-8d7f-831c9ec314de-c000.snappy.parquet' INTO TABLE EMPINFO.EMPLOYEE")

但如果我使用通配符而不是文件名(* 或 *.parquet),则会出现错误。

spark.sql("LOAD DATA INPATH '/home/hdfs/sparkwork/hiveproj/Data/empinfo/empl_par/*.parquet' INTO TABLE EMPINFO.EMPLOYEE")

有没有办法在 hive 命令中使用通配符从 spark 推送文件夹的所有内容? 请帮忙。

【问题讨论】:

为了获得更好的性能,请尝试使用 spark 函数而不是 hive - spark.read.format("parquet").load("/home/hdfs/sparkwork/hiveproj/Data/empinfo/empl_par/*.parquet").write.insertInto("EMPINFO.EMPLOYEE") 太棒了。这对我有用。谢谢斯里尼瓦斯。 这只是一个后续问题。我想我可以避免在工作中创建镶木地板文件。不是吗?一旦我阅读了 csv 文件,我就会得到 empdf 数据框。我可以直接将这个数据框写入配置单元表不是吗? spark.write.insertInto("EMPINFO.EMPLOYEE") 由于表数据配置为 parquet 存储,如果我们使用 insertInto(),数据将存储为 parquet。我说的对吗? 是的,你只需要调用 df.write.insertInto(..) 如果目标表是分区的,那么我们需要在insertInto()中提到分区列吗? 【参考方案1】:

而不是spark.sql("LOAD DATA INPATH '/home/hdfs/sparkwork/hiveproj/Data/empinfo/empl_par/*.parquet' INTO TABLE EMPINFO.EMPLOYEE")

尝试使用这个empdf.write.partitionBy("year","month","day").insertInto("EMPINFO.EMPLOYEE")

注意我使用的分区列是year,month & day。您可能需要根据您的要求进行更改。

【讨论】:

以上是关于如何使用 spark 的通配符运行 LOAD DATA INPATH hive 命令?的主要内容,如果未能解决你的问题,请参考以下文章

sqlContext.read...load() 和 sqlContext.write...save() 代码在 Spark 集群上运行在哪里?

在 spark 中获取 parquet 表目录的源文件

从文件系统有条件地加载分区

无法读取基于正则表达式的文件 spark

Spark 使用bulk load导入数据到Hbase中

Spark 和 SparkSQL:如何模仿窗口功能?