你可以简单地给出根路径,
spark.read.parquet("s3://latest/data/")
带有选项。
spark.hive.mapred.supports.subdirectories true
spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive true
然后,spark 会从 /data/ 文件夹到子目录递归查找 parquet 文件。
下面的代码是示例。
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 hs 的内容
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之类的路径放上去,它被识别为一个分区结构,所以结果就是把它作为一个列。