如何在单个加载中导入多个csv文件?

时间:2016-06-05 08:37:13

标签: apache-spark apache-spark-sql spark-dataframe

考虑我有一个已定义的架构,用于在文件夹中加载10个csv文件。有没有办法使用Spark SQL自动加载表。我知道这可以通过为每个文件使用单独的数据帧来执行[下面给出],但是可以使用单个命令自动执行,而不是指向文件,我可以指向文件夹吗?

df = sqlContext.read
       .format("com.databricks.spark.csv")
       .option("header", "true")
       .load("../Downloads/2008.csv")

6 个答案:

答案 0 :(得分:76)

使用通配符,例如将2008替换为*

df = sqlContext.read
       .format("com.databricks.spark.csv")
       .option("header", "true")
       .load("../Downloads/*.csv") // <-- note the star (*)

Spark 2.0

// 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")

注意:

  1. 使用format("com.databricks.spark.csv")format("csv")方法替换csvcom.databricks.spark.csv格式已集成到2.0。

  2. 使用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,....