Apache PySparkのデータフレーム:包括的なチュートリアル[例付き]
公開: 2020-02-27今日は、 ApachePySparkのDataFrameについて学習します。 Pysparkは、2020年のトップデータサイエンスツールの1つです。これは、ApacheSparkの行の分散コレクションの列と呼ばれます。 これは、Excelシートのテーブルまたは列に非常によく似ており、リレーショナルデータベースのテーブルにも似ています。 PySpark DataFrameには、RDDと同様の特性があります。
分散: DataFrameとRDDの性質は両方とも分散されています
遅延評価:アクションが実行されない場合、タスクの実行は行われません。
不変の性質: RDD / DataFrameのもう1つの同様の特性は、作成後に変更できないことです。 ただし、変換を適用してRDD/DataFrameを変換することはできます。
目次
DataFrameの利点
1.これは、Java、Scala、R、Pythonなど、APIサポートの観点から役立つさまざまな言語をサポートします。 複数の言語のAPIサポートは、多くのプログラミング言語での作業に役立ちます。
2.さまざまなデータソースとフォーマットがDataFrameでサポートされているため、さまざまなデータソースとそのフォーマットを便利に使用できます。
3. DataFrameの最も優れた点の1つは、ペタバイト単位のデータも処理できることです。これは、このような大量のデータを処理する優れた機能です。
4. Apache Sparkは、Spark DataFrameでの観察により、DataFrameのスキーマをすばやく理解します。 名前付きの列の下に、SparkDataFrameの監視が編成されています。 このようにして、クエリ実行の計画が最適化されます。
5. DataFramesを実行するように設計されているため、大量の半構造化データと構造化データをすばやく処理できます。
ApacheSparkのセットアップ
Apache Sparkは、DataFrame操作で使用を開始する前にマシンにセットアップする必要があります。 さまざまなDataFrame操作をサポートしているため、DataFrameをサポートしてデータを操作できます。 ここでは、いくつかの一般的なDataFrameの操作について説明します。
SparkContextの作成は、Apacheのプログラミングの最初のステップです。 クラスター内で操作を実行するには、SparkContextの要件があります。 クラスターにアクセスする方法は、SparkContextによって指示されます。 また、クラスターを取得する場所についてのSparkも表示されます。
読む:ディープラーニングフレームワーク
次に、Apacheクラスター接続が確立されます。 Spark Shellを使用している場合、その作成はすでに完了しています。 もう1つの方法は、SparkContextを作成するために、構成設定を提供、初期化、およびインポートすることができます。
このコードを作成に使用できます。
pysparkからインポートSparkContext
sc = SparkContext()
CSVファイルからのDataFrameの作成
CSVファイルを読み取れるように、Pythonのシェルで新しいライブラリを指定する必要があります。 これを行うための最初のステップは、Spark-CSVパッケージの最新バージョンをダウンロードし、Sparkのホームディレクトリでパッケージの抽出を行うことです。 その後、PySparkのシェルを開き、パッケージを含める必要があります。
$ ./bin/pyspark –packages com.databricks:spark-csv_2.10:1.3.0
これで、CSVファイルからデータが読み取られた後にDataFrameが作成されます。
train = sqlContext.load(source =” com.databricks.spark.csv”、path ='PATH / train.csv'、header = True、inferSchema = True)
test = sqlContext.load(source =” com.databricks.spark.csv”、path ='PATH / test-comb.csv'、header = True、inferSchema = True)
テストCSVファイルとトレーニングCSVファイルは、PATHというフォルダーの場所にあります。 CSVのファイルにヘッダーがある場合は、Trueと表示されます。 データフレームの各列のデータのタイプを知るために、inferSchema=Trueオプションを使用します。 inferSchema = Trueオプションを使用すると、データフレームの各列のデータ型の検出がSQLコンテキストによって自動的に検出されます。 inferSchemaをtrueに設定しない場合、すべての列が文字列として読み取られます。
読む:機械学習用のPythonライブラリ
DataFrameの操作
ここで、データフレームを操作する方法を見ていきます。
- 列のデータ型を知る
printSchemaは、列タイプとそのデータ型を確認するために使用されます。 これで、printSchema()を適用することにより、スキーマがツリー形式で印刷されます。
train.printSchema()
出力:
根
| – user_ID:整数(null許容= true)
| – product_ID:文字列(null許容= true)
| –性別:文字列(nullable = true)
| –年齢:文字列(null許容= true)
| –職業:整数(null許容= true)
| – City_Category:文字列(nullable = true)
| – Stay_In_Current_City_Years:文字列(nullable = true)
| – Marital_Status:整数(null許容= true)
| – product_Category_1:整数(null許容= true)
| – product_Category_2:整数(null許容= true)
| – product_Category_3:整数(null許容= true)
| –購入:整数(null許容= true)
csvのファイルを読み取ると、データの種類またはデータフレーム内の各列のスキーマが正確に取得されていることがわかります。
- 最初のn個の観測値を表示
最初のn個の観測値を確認するには、ヘッド操作を使用できます。 Pandasのヘッド操作は、PySparkのヘッド操作と同じです。
train.head(5)
出力:
[Row(User_ID = 1000001、Product_ID = u'P00069042'、Gender = u'F'、Age = u'0-17'、Occupation = 10、City_Category = u'A'、Stay_In_Current_City_Years = u'2'、Marital_Status = 0、Product_Category_1 = 3、Product_Category_2 = None、Product_Category_3 = None、Purchase = 8370)、
Row(User_ID = 1000001、Product_ID = u'P00248942'、Gender = u'F'、Age = u'0-17'、Occupation = 10、City_Category = u'A'、Stay_In_Current_City_Years = u'2'、Marital_Status = 0 、Product_Category_1 = 1、Product_Category_2 = 6、Product_Category_3 = 14、Purchase = 15200)、
Row(User_ID = 1000001、Product_ID = u'P00087842'、Gender = u'F'、Age = u'0-17'、Occupation = 10、City_Category = u'A'、Stay_In_Current_City_Years = u'2'、Marital_Status = 0 、Product_Category_1 = 12、Product_Category_2 = None、Product_Category_3 = None、Purchase = 1422)、
Row(User_ID = 1000001、Product_ID = u'P00085442'、Gender = u'F'、Age = u'0-17'、Occupation = 10、City_Category = u'A'、Stay_In_Current_City_Years = u'2'、Marital_Status = 0 、Product_Category_1 = 12、Product_Category_2 = 14、Product_Category_3 = None、Purchase = 1057)、
Row(User_ID = 1000002、Product_ID = u'P00285442'、Gender = u'M'、Age = u'55 +'、Occupation = 16、City_Category = u'C'、Stay_In_Current_City_Years = u'4 +'、Marital_Status = 0 、Product_Category_1 = 8、Product_Category_2 = None、Product_Category_3 = None、Purchase = 7969)]
次に、show操作を使用して、結果が行の形式で表示されるため、より良い方法で結果を確認します。 引数truncate=Trueを使用して、結果を切り捨てることもできます。
train.show(2、truncate = True)
出力:
+ ——- + ———- +-+-+ ———- + ————- + ————————– + ————– + —————— + —————— + —————— + ——– +
| User_ID |Product_ID|性別| 年齢|職業|City_Category| Stay_In_Current_City_Years | Marital_Status | Product_Category_1 | Product_Category_2 |Product_Category_3|購入|
+ ——- + ———- +-+-+ ———- + ————- + ————————– + ————– + —————— + —————— + —————— + ——– +
| 1000001 | P00069042 | F | 0-17 | 10 | A | 2 | 0 | 3 | null | null | 8370 |
| 1000001 | P00248942 | F | 0-17 | 10 | A | 2 | 0 | 1 | 6 | 14 | 15200 |
+ ——- + ———- +-+-+ ———- + ————- + ————————– + ————– + —————— + —————— + —————— + ——– +
上位2行のみを表示
- DataFrameの行数のカウント
データフレームの行数をカウントするには、カウントの操作を使用できます。 次に、カウント操作を適用して、テストファイルとトレーニングファイルの行数をカウントします。
train.count()、test.count()
出力:
(233598、550069)
テストとトレーニングには、それぞれ233598、550069の行があります。
- テストファイルとトレインファイルから列の数と列の名前を取得する
パンダのDataFrameの列の操作と同様に、列の名前を取得するために列の操作を使用します。 まず、番号を印刷します。 テストファイルとトレインファイルからの列の名前と列の名前。
len(train.columns)、train.columns
出力:
12 ['User_ID'、'Product_ID'、'Gender'、'Age'、'Occupation'、'City_Category'、'Stay_In_Current_City_Years'、'Marital_Status'、'Product_Category_1'、'Product_Category_2'、'Product_Category_3'、'Purchory_3'
現在、テストファイルに対しても同様に実行しています。
len(test.columns)、test.columns
出力:
13 [”、'User_ID'、'Product_ID'、'Gender'、'Age'、'Occupation'、'City_Category'、'Stay_In_Current_City_Years'、'Marital_Status'、'Product_Category_1'、'Product_Category_2'、'Product_Category_3'、 ' ']
上記の出力の後、トレーニングファイルに12列、テストファイルに13列あることがわかります。 上記の出力から、テストファイルに13列、トレーニングファイルに12列あることを確認できます。 列「Comb」はテストファイル内の唯一の単一の列であり、テストファイルに存在しない「Purchase」はありません。 テストファイルにもう1つの列があり、列の名前がないことがわかります。
- カウント、最大、最小、標準逸脱度、平均などの要約統計量をDataFrameの数値列で取得する
DataFrameでは、describe操作と呼ばれる操作を使用します。 数値列の計算を行い、describe操作を使用して統計要約を取得できます。 すべての数値列はDataFrameで計算されます。要約統計量の計算では、列名は指定されていません。
train.describe()。show()
出力:
+ ——- + —————— + —————– + ——————- + —————— + —————— + —————— +- ———— +
|概要| User_ID | 職業| Marital_Status | Product_Category_1 | Product_Category_2 | Product_Category_3 | 購入|

+ ——- + —————— + —————– + ——————- + —————— + —————— + —————— +- ———— +
| カウント| 550068 | 550068 | 550068 | 550068 | 376430 | 166821 | 550068 |
| 平均|1003028.8424013031| 8.076706879876669 | 0.40965298835780306 | 5.404270017525106 | 9.842329251122386 | 12.668243206790512 | 9263.968712959126 |
| stddev | 1727.5915855308265 | 6.522660487341778 | 0.4917701263173273 | 3.9362113692014082 | 5.086589648693526 | 4.125337631575267 | 5023.0653938206015 |
| 分| 1000001 | 0 | 0 | 1 | 2 | 3 | 12 |
| 最大| 1006040 | 20 | 1 | 20 | 18 | 18 | 23961 |
+ ——- + —————— + —————– + ——————- + —————— + —————— + —————— +- ———— +
describe操作では、これは文字列列名またはカテゴリ列名が指定されたときに取得されるものです。
train.describe('Product_ID')。show()
出力:
+ ——- + ———- +
|概要|Product_ID|
+ ——- + ———- +
| カウント| 550068 |
| 平均| null |
| stddev | null |
| 分| P00000142 |
| 最大| P0099942 |
+ ——- + ———- +
ASCIIに基づいて、の最大値と最小値が計算されます。 記述操作は、文字列型の列を処理するために使用されます。
- DataFrameの列の選択
選択操作で列の名前を使用して列を選択します。 列の名前はコンマで区切って記載します。 次に、トレーニングファイルから「Age」と「User_ID」がどのように選択されるかを確認します。
- train.select('User_ID'、'Age')。show(5)
- 出力:
- + ——-+ —-+
- | User_ID | 年齢|
- + ——-+ —-+
- | 1000001 | 0-17 |
- | 1000001 | 0-17 |
- | 1000001 | 0-17 |
- | 1000001 | 0-17 |
- | 1000002 | 55歳以上|
- + ——-+ —-+
- 明確な製品番号を見つける。 テストファイルとトレインファイル
DataFrameの番号を計算します。 個別の行の場合、個別の操作を使用します。 ここで、noの計算に個別の操作を適用します。 テストおよびトレインファイル内の個別の製品の。
train.select('Product_ID')。distinct()。count()、test.select('Product_ID')。distinct()。count()
出力:
(3633、3492)
テストファイルとトレインファイルには、それぞれ3492と3633の異なる製品があります。 これで、トレーニングファイルには、出力結果から学習できるように、テストファイルよりも明確な値があることがわかりました。 次に、減算操作を使用して、トレーニングファイルには存在しないが、テストファイルには存在するProduct_IDカテゴリを見つけます。 カテゴリカルのすべての機能に対しても同じことができます。
diff_cat_in_train_test = test.select('Product_ID')。subtract(train.select('Product_ID'))
diff_cat_in_train_test.distinct()。count()#個別のカウント用
出力:
46
したがって、上記の結果から、トレーニングファイルには存在しないがテストファイルには存在する47のさまざまなカテゴリがあることがわかります。 データはスキップされるか、列車のファイルに存在しないテストファイルから収集されます。
- カテゴリ列のペアワイズ頻度の計算?
クロス集計操作ができる操作を使用して、DataFrame内の列のペアワイズ頻度の計算を行います。 次に、クロス集計操作を適用して、列車のDataFrameの「Gender」列と「Age」列を計算してみましょう。
train.crosstab('Age'、'Gender')。show()
出力:
+ ———- +-+-+
| Age_Gender | F | M |
+ ———- +-+-+
| 0-17 | 5083 | 10019 |
| 46-50 | 13199 | 32502 |
| 18-25 | 24628 | 75032 |
| 36-45 | 27170 | 82843 |
| 55歳以上| 5083 | 16421 |
| 51-55 | 9894 | 28607 |
| 26-35 | 50752 | 168835 |
+ ———- +-+-+
Genderの明確な値は列名であり、Ageの異なる量は行名です。これは、上記の結果で確認できます。 表では、ペアが発生していない場合、ペアのカウントはゼロになります。
一意の行を持つDataFrameを取得するにはどうすればよいですか?
一意の行を検索し、重複する行を含めないようにするには、 dropDuplicates操作を使用します。 DataFrameの重複行を削除することにより、重複行のないDataframeを取得します。 列のすべての一意の行を取得するためにdropDuplicatesプロシージャがどのように実行されるかを知るには、ここを確認してください。
train.select('Age'、'Gender')。dropDuplicates()。show()
出力:
+-+-+
| 年齢|性別|
+-+-+
| 51-55 | F |
| 51-55 | M |
| 26-35 | F |
| 26-35 | M |
| 36-45 | F |
| 36-45 | M |
| 46-50 | F |
| 46-50 | M |
| 55歳以上| F |
| 55歳以上| M |
| 18-25 | F |
| 0-17 | F |
| 18-25 | M |
| 0-17 | M |
+-+-+
- 行を削除する方法はnull値になりますか?
null値を持つすべての行を削除したい場合は、 dropna操作と呼ばれる操作を使用できます。 DataFrameから行を削除するために、3つのオプションが考慮されます。
- サブセット–null値を持つ列を削除する操作で考慮される列のすべての名前のリストです。
- Thresh –これはthresh以外のnull値未満の行を削除するのに役立ちます。 デフォルトでは、これには何も指定されていません。
- 方法–すべてまたはいずれか2つのタイプで使用できます。 anyを使用すると、行のいずれかの値がnullの場合に行が削除されます。 allを使用すると、すべての行の値がnullの場合に行が減少します。
ここでは、これらすべてのオプションを1つずつ使用して、サブセット、スレッシュ、None for how、none、anyなどのデフォルトオプションを使用してnullの行を削除します。
train.dropna()。count()
出力:
166821
- DataFrameのnull値を定数番号で埋める方法は?
null値を定数noで埋めます。 ここではfillna操作を使用します。 null値を埋めるためにfillna操作で考慮される2つのパラメーターがあります。
- サブセット:ここでは、値を入力するために考慮される列を指定する必要があります。
- value:ここで、どの値に置き換えるかについて言及できます。これは、すべての列でstring、float、intなどの任意のデータ型にすることができます。
ここでは、trainDataFrameのnull値の代わりに「-1」を入力します。
train.fillna(-1).show(2)
出力:
+ ——- + ———- +-+-+ ———- + ————- + ————————– + ————– + —————— + —————— + —————— + ——– +
| User_ID |Product_ID|性別| 年齢|職業|City_Category| Stay_In_Current_City_Years | Marital_Status | Product_Category_1 | Product_Category_2 |Product_Category_3|購入|
+ ——- + ———- +-+-+ ———- + ————- + ————————– + ————– + —————— + —————— + —————— + ——– +
| 1000001 | P00069042 | F | 0-17 | 10 | A | 2 | 0 | 3 | -1 | -1 | 8370 |
| 1000001 | P00248942 | F | 0-17 | 10 | A | 2 | 0 | 1 | 6 | 14 | 15200 |
+ ——- + ———- +-+-+ ———- + ————- + ————————– + ————– + —————— + —————— + —————— + ——– +
上位2行のみを表示
結論
PySparkは、人工知能と機械学習の世界で勢いを増しています。 PySparkは、実際の機械学習の問題を解決するために使用されます。 外部と既存の両方の異なるデータソースからRDDを作成し、そのデータに対してすべてのタイプの変換を実行できます。 この記事が有益であり、PySparkデータフレームに関する深い洞察を提供できたことを願っています。
PySparkやその他のデータサイエンスツールについて知りたい場合は、IIIT-B&upGradのデータサイエンスのPGディプロマをチェックしてください。これは、働く専門家向けに作成され、10以上のケーススタディとプロジェクト、実践的なハンズオンワークショップ、メンターシップを提供します。業界の専門家、業界のメンターと1対1で、400時間以上の学習とトップ企業との仕事の支援。
PySparkはPandasよりも効率的ですか?
はい、PySparkはPandasよりも高速であり、ベンチマークテストでもPandasよりも優れています。 基本的に、Pandasは単一のマシンで操作を実行しますが、PySparkは複数のマシンで操作を実行します。 巨大なデータセットを使用して機械学習アプリケーションで作業している場合、PySparkはPandasよりも100倍高速に操作を実行できるため、理想的なオプションです。 JVMのおかげで、Scalaプログラミング言語はデータ分析と処理においてPythonよりも10倍高速です。 Pythonプログラミングコードを使用してSparkライブラリを呼び出すと、結果は平凡です。
Apache PySparkを使用することの欠点は何ですか?
Sparkには独自のファイル管理システムがありません。 Sparkの操作に必要な追加メモリのコストが高いため、インメモリコンピューティングは非常にコストがかかる可能性があります。 開発者がHadoopでApacheSparkを利用する場合、コンパクトファイルで問題が発生します。 データはSparkでバッチで反復され、各反復は個別に計画および処理されます。 Apache Sparkでは、データは所定の時間間隔で小さなバッチに分割されます。 その結果、レコードベースのウィンドウ基準はApacheではサポートされません。 代わりに、時間ベースのウィンドウ基準を提供します。
データセット、DataFrame、RDDはどのように異なりますか?
RDDは、複数のコンピューターに分散されたデータ項目のクラスター化されたコレクションです。 データは、JavaまたはScalaオブジェクトのコレクションであるRDDを介して表されます。 DataFrameは、多くのサーバーに分散された名前付き列に構造化されたデータのコレクションです。 リレーショナルデータベースでは、概念的にはテーブルと同等です。 データセットは、RDDAPIのタイプセーフなオブジェクト指向プログラミングインターフェイス機能を提供するデータフレームAPI拡張機能です。 DataFrameは、RDDと同様の分散データのコレクションであり、変更できません。 データは、RDDではなく、リレーショナルデータベースのテーブルに似た名前付きの列に構造化されます。 データのグループ化などの単純なタスクに関しては、RDDはデータフレームとデータセットの両方よりも低速です。 集約タスクを実行するためのシンプルなAPIがあります。 RDDやデータセットよりも迅速にデータを集約できます。