是否可以通过将basePath选项与spark读取配合使用通配符(*)来一次性读取具有不同basePath的多个分区镶木文件?例如:
spark.read.option("basePath","s3://latest/data/*/").parquet(*dir)
出现错误:
error: pyspark.sql.utils.IllegalArgumentException: u"Option 'basePath' must be a directory"
答案 0 :(得分:1)
不。您可以将多个paths
与单个基本路径结合使用,以获取DF模式中的分区列,但是您不能指定多个base paths
或在该基本路径.string中使用通配符。>
答案 1 :(得分:-1)
您只需提供根路径,
spark.read.parquet("s3://latest/data/")
带有选项。
spark.hive.mapred.supports.subdirectories true
spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive true
然后,星火会从/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
之类的路径,它被认为是分区结构,因此结果将其作为一列。