读取镶木地板文件时,是否可以在basePath中使用通配符?

时间:2020-07-30 19:40:43

标签: apache-spark pyspark

是否可以通过将basePath选项与spark读取配合使用通配符(*)来一次性读取具有不同basePath的多个分区镶木文件?例如:

spark.read.option("basePath","s3://latest/data/*/").parquet(*dir)

出现错误:

error:   pyspark.sql.utils.IllegalArgumentException: u"Option 'basePath' must be a directory"

2 个答案:

答案 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之类的路径,它被认为是分区结构,因此结果将其作为一列。