2016-06-26 4 views
5

文字列がcol1、配列列がcol2のDataFrameがあるとします。私は、Spark操作で舞台裏で何が起こるか疑問に思った:スパーク選択分解イディオムはどのように実装されていますか?

df.select('col1', explode('col2'))

selectが入力としてColumnオブジェクトのシーケンスを取り、explodeColumnので、タイプが一致を返すようです。しかし、explode('col2')によって返される列は、論理的にはcol1とは異なる長さなので、出力DataFrameを構築する際にselectがどのように "同期"するのか不思議でした。私は手がかりのためにColumnクラスを見てみましたが、本当に何も見つかりませんでした。

答えて

6

答えは簡単です。Columnというデータ構造はありません。 Spark SQLはキャッシングにカラム型ストレージを使用しますが、いくつかの低レベル操作にはデータレイアウトを活用することができますが、カラムはデータコンテナではなくデータと変換の説明です。だから少しビットをexplode簡素化flatMapは、Dataset[Row]上にあります。

+0

ありがとうございます!私の質問は、技術的にはデータフレームに関するものでしたが、私はそれが同じことを推測しています。これは[これの例です](https://github.com/apache/spark/blob/v2.0.0-rc1/sql/core/src/main/scala/org/apache/spark/sql/Dataset.scala# L1587-L1604)をDataset.scalaソースから削除します。 – hillel

+1

'DataFrame'は' Dataset [Row] 'です。 – zero323

関連する問題