web-dev-qa-db-ja.com

単一のロードで複数のcsvファイルをインポートする方法は?

フォルダーに10個のcsvファイルを読み込むための定義済みスキーマがあると考えてください。 Spark SQLを使用してテーブルを自動的にロードする方法はありますか。これは各ファイルに個別のデータフレームを使用することで実行できることは知っていますが(下を参照)、ファイルを指定するのではなく、単一のコマンドで自動化できますか?

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

ワイルドカードを使用します。 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")またはcsvメソッドを使用して、format("csv")を置き換えます。 com.databricks.spark.csv形式は2.0に統合されました。

  2. sparkではなくsqlContextを使用します

82
Yaron

読者のダイジェスト:(Spark 2.x)

たとえば、csvファイルを保持する3つのディレクトリがある場合:

dir1、dir2、dir3

次にpathsを、次のようにパスのコンマ区切りリストの文字列として定義します。

パス = "dir1 /、dir2 /、dir3/*"

次に、次の関数を使用して、このpaths変数を渡します

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)

これら3つのディレクトリで見つかったすべてのcsvからのデータを含む単一のsparkデータフレームをdfで取得します。

============================================= ============================

フルバージョン:

複数のディレクトリからの複数の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-09

そして、それらのそれぞれについて、というディレクトリのみを取ります

184

そして、そのサブディレクトリ内ですべてのcsvファイルを探します。

そして、これはコンマ区切りリストの各パターンに対して実行されます。

これは、ユニオンよりもうまく機能します。

14
eiTan LaVi

以下のような他のトリックを使用できることに注意してください。

-- One or more wildcard:
       .../Downloads20*/*.csv
--  braces and brackets   
       .../Downloads201[1-5]/book.csv
       .../Downloads201{11,15,19,99}/book.csv
11
Jamal Jam

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

Ex

名前のリストを渡す複数の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: _*)
5
mputha

Spark 2.0+を使用すると、df = spark.read.csv(['directory_1','directory_2','directory_3'.....], header=True)を使用して異なるディレクトリから複数のCSVファイルをロードできます。詳細については、ドキュメントを参照してください here