フォルダーに10個のcsvファイルを読み込むための定義済みスキーマがあると考えてください。 Spark SQLを使用してテーブルを自動的にロードする方法はありますか。これは各ファイルに個別のデータフレームを使用することで実行できることは知っていますが(下を参照)、ファイルを指定するのではなく、単一のコマンドで自動化できますか?
df = sqlContext.read
.format("com.databricks.spark.csv")
.option("header", "true")
.load("../Downloads/2008.csv")
ワイルドカードを使用します。 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")
またはcsv
メソッドを使用して、format("csv")
を置き換えます。 com.databricks.spark.csv
形式は2.0に統合されました。
spark
ではなくsqlContext
を使用します
読者のダイジェスト:(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ファイルを探します。
そして、これはコンマ区切りリストの各パターンに対して実行されます。
これは、ユニオンよりもうまく機能します。
以下のような他のトリックを使用できることに注意してください。
-- One or more wildcard:
.../Downloads20*/*.csv
-- braces and brackets
.../Downloads201[1-5]/book.csv
.../Downloads201{11,15,19,99}/book.csv
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: _*)
Spark 2.0+を使用すると、df = spark.read.csv(['directory_1','directory_2','directory_3'.....], header=True)
を使用して異なるディレクトリから複数のCSVファイルをロードできます。詳細については、ドキュメントを参照してください here