在Spark 2

时间:2018-05-19 16:57:16

标签: scala apache-spark apache-spark-sql apache-spark-2.2

如何在Spark 2 SQL中创建垂直表。

我正在使用Spark 2 / SQL / Scala构建ETL。我有正常表结构中的数据,如。

输入表:

| ID | A  | B  | C  | D  |
| 1  | A1 | B1 | C1 | D1 |
| 2  | A2 | B2 | C2 | D2 |

输出表:

| ID | Key | Val |
| 1  | A   | A1  |
| 1  | B   | B1  |
| 1  | C   | C1  |
| 1  | D   | D1  |
| 2  | A   | A2  |
| 2  | B   | B2  |
| 2  | C   | C2  |
| 2  | D   | D2  |

1 个答案:

答案 0 :(得分:0)

这也可以解决问题:

输入数据:

+---+---+---+---+---+
|ID |A  |B  |C  |D  |
+---+---+---+---+---+
|1  |A1 |B1 |C1 |D1 |
|2  |A2 |B2 |C2 |D2 |
|3  |A3 |B3 |C3 |D3 |
+---+---+---+---+---+

压缩列标题,不包含任何列:

val cols = Seq("A","B","C","D") zip Range(0,4,1)
df.flatMap(r => cols.map(i => (r.getString(0),i._1,r.getString(i._2 + 1)))).toDF("ID","KEY","VALUE").show()

结果应如下所示:

+---+---+-----+
| ID|KEY|VALUE|
+---+---+-----+
|  1|  A|   A1|
|  1|  B|   B1|
|  1|  C|   C1|
|  1|  D|   D1|
|  2|  A|   A2|
|  2|  B|   B2|
|  2|  C|   C2|
|  2|  D|   D2|
|  3|  A|   A3|
|  3|  B|   B3|
|  3|  C|   C3|
|  3|  D|   D3|
+---+---+-----+
祝你好运!