行と列の変換は、実際には非常に一般的なデータ分析操作であり、通常の関数では達成できない効果を達成するためにデータのスプライシングと分割で使用されます。
列から行へ
まず、列変換関数を紹介します。関連する組み込み関数は、collect_listは列変換後に重複を削除せず、collect_setはcollect_set列変換後に重複を削除します。列から行へはデータの列を集約する操作であり、この列のデータ型は文字列である必要があります。使用例は次のとおりです。元のデータは次のとおりです
2018-01,项目1,100
2018-01,项目2,200
2018-01,项目3,300
2018-01,项目3,400
2018-02,项目1,1000
2018-02,项目2,2000
2018-03,项目x,999
sqlは次のとおりです
spark.sql("select yue, collect_set(project) projects,sum(shouru) zsr from sr group by yue").show()
結果は次のとおりです。
+-------+---------------+----+
| yue| projects| zsr|
+-------+---------------+----+
|2018-03| [项目x]| 999|
|2018-02| [项目1, 项目2]|3000|
|2018-01|[项目1, 项目2, 项目3]| 600|
collect_setを使用すると、データの重複がなくなります。使用する場合は、必要に応じて使用してください。
行から列へ
組み込み関数explodeを含む行から列への関数を紹介しましょう分解関数とUDAFワンインマルチプルアウト関数は異なることを全員に思い出させる必要があります.2つの結果は側面図の使用によく使用されますが、行から列への関数はそれほど柔軟ではありません使用中のUDAF。行間UDAFと比較して、レコード内の特定のフィールドデータを最初にデータの列に分割する機能と言えます。UDAFは、入力と出力、および行から列を柔軟に制御できます。渡す必要があるため、通常は分割と同時に表示されます。コンテナデータ
データは以下の通りです
A 20 篮球,排球,乒乓球
B 30 跳舞,唱歌
C 23 唱歌,爬山
声明は次のとおりです
spark.sql("select name,age,t.hobby from sr2 lateral view explode(split(hobby,',')) t as hobby").show()
結果は次のとおりです。結果は自動的に垂直方向に照合されます
+----+---+-----+
|name|age|hobby|
+----+---+-----+
| A| 20| 篮球|
| A| 20| 排球|
| A| 20| 乒乓球|
| B| 30| 跳舞|
| B| 30| 唱歌|
| C| 23| 唱歌|
| C| 23| 爬山|
+----+---+-----+