私はSpark-DataFrame APIの初心者です。
このコードを使用して、CSVをタブ区切りでSpark Dataframeにロードします
lines = sc.textFile('tail5.csv')
parts = lines.map(lambda l : l.strip().split('\t'))
fnames = *some name list*
schemaData = StructType([StructField(fname, StringType(), True) for fname in fnames])
ddf = sqlContext.createDataFrame(parts,schemaData)
Spark=新しいファイルからDataFrameを作成し、組み込みメソッドtoPandas()を使用して、pandasに変換します。
spark=を使用してCSVファイルをpandas
に読み込むことは、CSVファイルをメモリに読み込むという最終目標を達成するための非常に遠回りの方法です。
ここで使われているテクノロジーのユースケースを誤解しているようです。
Sparkは分散コンピューティング用です(ただし、ローカルで使用できます)。一般に、CSVファイルを単に読み取るために使用するには、あまりにも重いです。
あなたの例では、_sc.textFile
_メソッドは単にspark RDDを与えます。これは事実上テキスト行のリストです。これはおそらくあなたが望むものではありません。型推論はありません実行されるため、CSVファイル内の数値の列を合計する場合、Sparkに関する限り文字列であるため、できません。
_pandas.read_csv
_を使用して、CSV全体をメモリに読み込みます。 Pandasは各列のタイプを自動的に推測します。Sparkはこれを行いません。
質問に答えましょう:
Pandasオブジェクトをローカルメモリに保存します:
はい。 toPandas()
は、Spark DataFrameをメモリ内にあるPandas DataFrameに変換します。
Does Pandas Sparkがすべて処理する低レベルの計算
いいえ。Pandasは独自の計算を実行します。sparkとpandasの間には相互作用はありません。単にsomeAPI適合。
すべてのpandasデータフレーム機能?を公開しましたか?
いいえ。たとえば、Series
オブジェクトにはinterpolate
メソッドがありますが、これはPySpark Column
オブジェクトでは使用できません。 pandas APIにはPySpark APIにはない多くのメソッドと関数があります。
DataFrame APIにそれほど手を加えることなく、Pandasに変換して、それで完了できますか?
絶対に。実際、この場合はおそらくSparkを使用するべきではありません。_pandas.read_csv
_は、hugeデータ量。
シンプルでローテクでわかりやすいライブラリを使用して問題を解決し、only必要に応じてより複雑なものに進んでください。多くの場合、より複雑なテクノロジーは必要ありません。
いくつかのsparkコンテキストまたはHiveコンテキストメソッド(sc.textFile()
、hc.sql()
)を使用して 'メモリに'データを読み込むと、RDDが返されますが、RDDは残ります分散メモリ(ワーカーノード上のメモリ)、マスターノード上のメモリではありません。すべてのRDDメソッド(rdd.map()
、rdd.reduceByKey()
など)は、ワーカーノード上で並列に実行するように設計されています。たとえば、rdd.collect()
メソッドを実行すると、すべてのワーカーノードからマスターノードメモリにrddの内容がコピーされることになります。したがって、分散コンピューティングのメリットが失われます(ただし、まだrddメソッドを実行できます)。
パンダでも同様に、toPandas()
を実行すると、データフレームを分散(ワーカー)メモリからローカル(マスター)メモリにコピーし、分散コンピューティング機能のほとんどを失います。そのため、(私がよく使用する)考えられるワークフローの1つは、分散コンピューティングメソッドを使用してデータを適切なサイズに事前調整してから、豊富な機能セットのPandasデータフレームに変換することです。お役に立てば幸いです。