データの読み込みと保存

1 モチベーション

Spark は、さまざまな入力ソースと出力ソースをサポートしています。次の 3 つの一般的なデータ ソースは次のとおりです。

  • ファイル形式とファイル システム: ローカル ファイル システムまたは分散ファイル システム (NFS、HDFS、Amazon S3 など) に格納されたデータの場合、spark は、テキスト ファイル、JSON、SequenceFile、プロトコル バッファーなど、さまざまなファイル形式にアクセスできます。
  • Spark SQL の構造化データ ソース: Spark は、JSON や Apache Hive などの構造化データ ソースを処理するための簡潔で効率的な API のセットを提供します。
  • データベースとキー値ストア: Spark 独自のライブラリと一部のサードパーティ ライブラリを使用して、Hbase、ES、および JDBS ソースなどに接続できます。

2 ファイル形式

Spark には、多くのファイル形式を簡単に読み取って保存する方法があります。などからテキスト ファイルなどの非構造化ファイルから、JSON 形式などの半構造化ファイル、さらに SequenceFile などの構造化ファイルへ、Spark はそれをサポートできます。Spark は、ファイル拡張子に従って、対応する処理方法を選択します。このプロセスはカプセル化されており、ユーザーに対して透過的です。一般的な形式は次のとおりです。

ここに画像の説明を挿入

2.1 テキストファイル

テキストファイルをRDDとして読み込むと、入力の各行はRDDの要素になります. キーがファイル名で、値がファイルの内容であるペア RDD として、複数の完全なテキスト ファイルを一度に読み取ることもできます。テキスト ファイルを読み取るには、次のように、ファイル パスを引数として SparkContext で textFile() 関数を呼び出すだけです。

input = sc.textFile("file://home/spark/README.md")

複数の入力ファイルが、データのすべての部分を含むディレクトリの形式で来る場合、これは 2 つの方法で処理できます。ディレクトリを引数として渡して textFile 関数を使用することもできます。これにより、パーツが RDD に読み込まれます。データの各部分 (ファイル名にキーを含む時間データなど) がどのファイルから来たかを知る必要がある場合もあれば、ファイル全体を一度に処理することが望ましい場合もあります。ファイルが十分に小さい場合は、SparkContext.wholeTextFiles() メソッドを使用できます。このメソッドは、キーが入力ファイルのファイル名であるペア RDD を返します。
テキストファイルの出力もかなり簡単です。saveAsTextFile() メソッドはパスを受け取り、RDD の内容をパスに対応するファイルに入力します。、Spark は着信パスをディレクトリとして扱い、そのディレクトリに複数のファイルを出力します。このように、Spark は複数のノードから並列に出力できます。この方法では、データのどの部分をどのファイルに出力するかを制御することはできませんが、一部の出力形式は制御をサポートしています。次のようにテキスト ファイルを保存します。

result.saveAsTextFile(outputFile)

2.2 ジェイソン

JSON は広く使用されている半構造化データ形式であり、JSON データを読み取る最も簡単な方法は、データをテキスト ファイルとして読み取ることです。次のように、python は JSON データを次のように読み取ります。

import json
data = input.map(lambda x: json.loads(x))

2.3 CSV

コンマ区切り値 (CSV) ファイルには、コンマで区切られた 1 行あたりの固定数のフィールドがあります。. JSON と同様に、CSV にはさまざまなライブラリがありますが、各言語で使用されるライブラリは 1 つだけです。繰り返しますが、Python の場合は、ネイティブの csv ライブラリを使用します。

2.4 シーケンスファイル

SequenceFile は、相対的なリレーショナル構造を持たないキーと値のペア ファイルで構成される一般的な Hadoop 形式です。. Hadoop はカスタムのシリアル化フレームワークを使用するため、SequenceFile は Hadoop の Writable インターフェイスを実装する要素で構成されます。以下は、sequenceFile ファイルを読み取るための python です。

data = sc.sequenceFile(inFile, "org.apache.hadoop.io.Text", "org.apache,hadoop.io.IntWritable")

3 Spark SQL の構造化データ

Spark SQL は、Spark 1.0 で Spark に追加された新しいコンポーネントであり、Spark で構造化データと半構造化データを操作する方法として急速に普及しています。いずれの場合も、Spark SQL に SQL クエリを与え、データ ソースに対してクエリを実行させます (いくつかのフィールドを選択するか、フィールドに対していくつかの関数を使用します)。Row オブジェクトで構成される RDD を取得します。各 Row オブジェクトはレコードを表します. Python では、row[column_number] と row.column_name を使用して要素にアクセスできます。

3.1 アパッチハイブ

Apache Hive は、Hadoop 上の構造化データの一般的なソースです. Hive は、HDFS 内または他のストレージ システムにさまざまな形式でテーブルを格納できます。Spark SQL を既存の Hive に接続するには、Hive 構成ファイルを提供する必要があります。hive-site.xml ファイルを Spark の ./conf/ ディレクトリにコピーする必要があります。これを行った後、次に、Spark SQL のエントリ ポイントである HiveContext オブジェクトを作成します。, and then you can use Hive Query Language (HQL) to query your table and get the returned data in the form of RDD composition of rows. 以下は、HiveContext を作成してデータをクエリするための python です。

from pyspark.sql import HiveContext
hiveCtx = HiveContext(sc)
rows = hiveCtx.sql("select name, age from users")
firstRow = rows.first()
print (firstRow.name)

3.2 JSON

レコード間で一貫した構造を持つ JSON データがある場合、Spark SQL は構造情報を自動的に推測し、これらのデータをレコードとして読み取ることもできるため、フィールドを抽出する操作が非常に簡単になります。HiveContext.jsonFile メソッドを使用して、ファイル全体から Row オブジェクトの RDD を取得します. json ファイルの内容が次のようになっているとします。
ここに画像の説明を挿入

以下は、python に基づいて json ファイルを読み取ることです。

data = hiveCtx.jsonFile("file.json")
data.registerTempTable("table_tmp")
results = hiveCtx.sql("select user.name, txt from table_tmp")

おすすめ

転載: blog.csdn.net/BGoodHabit/article/details/121577270