Apache spark 如何使用spark中的通配符在路径配置单元中运行加载数据命令?
我正在创建一个数据帧,如下所示:Apache spark 如何使用spark中的通配符在路径配置单元中运行加载数据命令?,apache-spark,pyspark,hive,Apache Spark,Pyspark,Hive,我正在创建一个数据帧,如下所示: 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(
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")
spark.sql("LOAD DATA INPATH '/home/hdfs/sparkwork/hiveproj/Data/empinfo/empl_par/*.parquet' INTO TABLE EMPINFO.EMPLOYEE")
但如果我使用通配符而不是文件名(*或*.parquet),则会产生错误。
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")
spark.sql("LOAD DATA INPATH '/home/hdfs/sparkwork/hiveproj/Data/empinfo/empl_par/*.parquet' INTO TABLE EMPINFO.EMPLOYEE")
是否有一种方法可以使用spark的配置单元中的通配符命令推送文件夹的所有内容?
请提供相同的帮助。而不是spark.sql(“将数据加载到path'/home/hdfs/sparkwork/hiveproj/DATA/empinfo/emp_par/*.parquet'表empinfo.EMPLOYEE”)
尝试使用此empdf.write.partitionBy(“年”、“月”、“日”).insertInto(“EMPINFO.EMPLOYEE”)
注意我使用了分区列作为
年
,月
,日
。您可能需要根据您的要求进行更改。为了获得更好的性能,请尝试使用spark函数而不是hive-spark.read.format(“parquet”).load(“/home/hdfs/sparkwork/hiveproj/Data/empinfo/emp_par/*.parquet”).write.insertInto(“empinfo.EMPLOYEE”)
。这对我有用。谢谢你,斯里尼瓦斯,我想再问你一个问题。我想我可以在工作中避免创建拼花地板文件。不是吗?一旦我读取了csv文件,我就会得到empdf数据帧。我可以直接将这个数据帧写入配置单元表,不是吗?spark.write.insertInto(“EMPINFO.EMPLOYEE”)由于表数据配置为存储为拼花,因此如果使用insertInto(),数据将存储为拼花。我说的对吗?是的,您只需要调用df.write.insertInto(..)如果目标表是分区的,那么我们需要在insertInto()中同时提到分区列吗?