考虑我有一个已定义的架构,用于在文件夹中加载10个csv文件。有没有办法使用Spark SQL自动加载表。我知道这可以通过为每个文件使用单独的数据帧来执行[下面给出],但是可以使用单个命令自动执行,而不是指向文件,我可以指向文件夹吗?
df = sqlContext.read
.format("com.databricks.spark.csv")
.option("header", "true")
.load("../Downloads/2008.csv")
答案 0 :(得分:76)
使用通配符,例如将2008
替换为*
:
df = sqlContext.read
.format("com.databricks.spark.csv")
.option("header", "true")
.load("../Downloads/*.csv") // <-- note the star (*)
// these lines are equivalent in Spark 2.0
spark.read.format("csv").option("header", "true").load("../Downloads/*.csv")
spark.read.option("header", "true").csv("../Downloads/*.csv")
注意:
使用format("com.databricks.spark.csv")
或format("csv")
方法替换csv
。 com.databricks.spark.csv
格式已集成到2.0。
使用spark
而不是sqlContext
答案 1 :(得分:12)
读者文摘:(Spark 2.x)
例如,如果您有3个目录,其中包含csv文件:
dir1,dir2,dir3
然后将路径定义为逗号分隔的路径列表字符串,如下所示:
路径 =“dir1 / ,dir2 / ,dir3 / *”
然后使用以下函数并将此路径变量
传递给它def get_df_from_csv_paths(paths):
df = spark.read.format("csv").option("header", "false").\
schema(custom_schema).\
option('delimiter', '\t').\
option('mode', 'DROPMALFORMED').\
load(paths.split(','))
return df
然后运行:
df = get_df_from_csv_paths(paths)
你将在df中获得一个火花数据帧,其中包含这3个目录中所有csvs的数据。
<强> ============================================ =============================== 强>
完整版:
如果您想从多个目录中提取多个CSV ,您只需传递一个列表并使用通配符。
例如:
如果您的data_path如下所示:
“S3:// BUCKET_NAME / subbucket_name / 2016-09 - * / 184 / *,
S3:// BUCKET_NAME / subbucket_name / 2016-10 - * / 184 / *,
S3:// BUCKET_NAME / subbucket_name / 2016-11 - * / 184 / *,
s3:// bucket_name / subbucket_name / 2016-12 - * / 184 / *,...'
您可以使用上述功能一次性摄取所有这些目录和子目录中的所有csv:
这将根据指定的通配符模式摄取s3 bucket_name / subbucket_name /中的所有目录。例如
中的第一个模式BUCKET_NAME / subbucket_name /
表示名称以
开头的所有目录2016-09 -
并且每个只占用名为
的目录184
并在该子目录中查找所有csv文件。
这将针对逗号分隔列表中的每个模式执行。
这比联盟更好..
答案 2 :(得分:8)
请注意,您可以使用其他技巧:
-- One or more wildcard:
.../Downloads20*/*.csv
-- braces and brackets
.../Downloads201[1-5]/book.csv
.../Downloads201{11,15,19,99}/book.csv
答案 3 :(得分:5)
Ex1 :
读取单个CSV文件。提供完整的文件路径:
val df = spark.read.option("header", "true").csv("C:spark\\sample_data\\tmp\\cars1.csv")
Ex2 :
读取传递名称的多个CSV文件:
val df=spark.read.option("header","true").csv("C:spark\\sample_data\\tmp\\cars1.csv", "C:spark\\sample_data\\tmp\\cars2.csv")
Ex3 :
通过名称列表读取多个CSV文件:
val paths = List("C:spark\\sample_data\\tmp\\cars1.csv", "C:spark\\sample_data\\tmp\\cars2.csv")
val df = spark.read.option("header", "true").csv(paths: _*)
Ex4 :
读取一个文件夹中的多个CSV文件而忽略其他文件:
val df = spark.read.option("header", "true").csv("C:spark\\sample_data\\tmp\\*.csv")
Ex5 :
从多个文件夹读取多个CSV文件:
val folders = List("C:spark\\sample_data\\tmp", "C:spark\\sample_data\\tmp1")
val df = spark.read.option("header", "true").csv(folders: _*)
答案 4 :(得分:3)
使用Spark 2.0+,我们可以使用来自不同目录的多个CSV文件
df = spark.read.csv(['directory_1','directory_2','directory_3'.....], header=True)
。有关更多信息,请参阅文档
here
答案 5 :(得分:0)
git checkout
将考虑文件tmp,tmp1,tmp2,....