Apache spark 在读取拼花地板文件时,是否有办法在basePath中使用通配符?
在使用带spark read的basePath选项时,是否有一种方法可以通过使用通配符(*)一次性读取具有不同basePath的多个分区拼花地板文件?例如:Apache spark 在读取拼花地板文件时,是否有办法在basePath中使用通配符?,apache-spark,pyspark,Apache Spark,Pyspark,在使用带spark read的basePath选项时,是否有一种方法可以通过使用通配符(*)一次性读取具有不同basePath的多个分区拼花地板文件?例如: spark.read.option("basePath","s3://latest/data/*/").parquet(*dir) 获取错误: error: pyspark.sql.utils.IllegalArgumentException: u"Option 'basePath'
spark.read.option("basePath","s3://latest/data/*/").parquet(*dir)
获取错误:
error: pyspark.sql.utils.IllegalArgumentException: u"Option 'basePath' must be a directory"
不可以。您可以将多个
路径
与单个基本路径结合使用,以获取DF架构中的分区列,但不能指定多个基本路径
,也不能将通配符用作该基本路径的一部分。string。您可以简单地给出根路径
spark.read.parquet("s3://latest/data/")
有了这些选择
spark.hive.mapred.supports.subdirectories true
spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive true
然后,spark将从/data/
文件夹到子目录递归地查找拼花地板文件
下面的代码是示例
import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.sql.SparkSession
val conf = new SparkConf()
.setMaster("local[2]")
.setAppName("test")
.set("spark.hive.mapred.supports.subdirectories","true")
.set("spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive","true")
val spark = SparkSession.builder.config(conf).getOrCreate()
val df = spark.read.parquet("s3a://bucket/path/to/base/")
SCALA:我已经用我的多个CSV文件进行了测试。目录的树结构是
.
|-- test=1
| `-- test1.csv
`-- test=2
`-- test2.csv
其中基本路径为s3://bucket/test/
。对于每个CSV,都会显示内容
test1.csv
x,y,z
tes,45,34
tes,43,67
tes,56,43
raj,45,43
raj,44,67
test2.csv
x,y,z
shd,43,34
adf,2,67
指挥部呢
val df = spark.read.option("header","true").csv("s3a://bucket/test/")
df.show(false)
结果如下:
+---+---+---+----+
|x |y |z |test|
+---+---+---+----+
|tes|45 |34 |1 |
|tes|43 |67 |1 |
|tes|56 |43 |1 |
|raj|45 |43 |1 |
|raj|44 |67 |1 |
|shd|43 |34 |2 |
|adf|2 |67 |2 |
+---+---+---+----+
PYSPARK
from pyspark.conf import SparkConf
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.master("yarn") \
.appName("test") \
.config("spark.hive.mapred.supports.subdirectories","true") \
.config("spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive","true") \
.getOrCreate()
df = spark.read.option("header","true").csv("s3a://bucket/test/")
df.show(10, False)
+---+---+---+----+
|x |y |z |test|
+---+---+---+----+
|tes|45 |34 |1 |
|tes|43 |67 |1 |
|tes|56 |43 |1 |
|raj|45 |43 |1 |
|raj|44 |67 |1 |
|shd|43 |34 |2 |
|adf|2 |67 |2 |
+---+---+---+----+
当我测试pyspark代码时,我没有中断代码。所以,请检查它是否正确。好吧,我把路径,比如
test=x
,它被认为是一个分区结构,所以结果是作为一列给出的。你能解释得更好吗?是的。需要对这个不确定的回答问题做一些解释吗?它与原来的问题有关吗?我很确定我回答了你的问题。我可以问你为什么不能接受答案吗?我加倍-checked@thebluephantom我已经接受了。没有办法做到我所期望的那些投了否决票的人,我想说的是,我只是在自己检查后才发布了这个问题。这个网站有时很难,有时很不合理。