如何将MapType列传输到列

时间:2019-02-08 16:24:45

标签: scala apache-spark

我的代码如下:

val df = List(
  (1,"A1", Map("AR" -> "B", "CE" -> "D")),
  (2,"A2", Map("AF" -> "B", "CR" -> "D")),
  (3,"A3", Map("AE" -> "B", "CF" -> "D")),
  (4,"A4", Map("AS" -> "B", "CG" -> "D")),
  (5,"A5", Map("AD" -> "B", "CH" -> "D")),
  (6,"A6", Map("AC" -> "B", "CS" -> "D")),
  (7,"A7", Map("AB" -> "B", "CA" -> "D"))
).toDF("id", "type", "tags")

df.createOrReplaceTempView("df")

当我跑步时:

spark.sql("select * from df").show()

我得到的结果是:

+---+----+--------------------+
| id|type|                tags|
+---+----+--------------------+
|  1|  A1|Map(AR -> B, CE -...|
|  2|  A2|Map(AF -> B, CR -...|
|  3|  A3|Map(AE -> B, CF -...|
|  4|  A4|Map(AS -> B, CG -...|
|  5|  A5|Map(AD -> B, CH -...|
|  6|  A6|Map(AC -> B, CS -...|
|  7|  A7|Map(AB -> B, CA -...|
+---+----+--------------------+

我期望的是:

+---+----+----+----+----+----+----+
| id|type|  AR|  CE|  AF|  AE|  AS|
+---+----+----+----+----+----+----+
|  1|  A1|   B|   D|null|null|null|
|  2|  A2|null|null|   B|null|null|
|  3|  A3|null|null|null|   B|null|
|  4|  A4|null|null|null|null|   B|
|  5|  A5|null|null|null|null|null|
|  6|  A6|null|null|null|null|null|
|  7|  A7|null|null|null|null|null|
+---+----+----+----+----+----+----+

我知道我可以这样获得以上结果:

spark.sql("select id, type, tags.AR, tags.CE, tags.AF, tags.AE, tags.AS from df").show()

我的问题是:“有没有一种简单的方法可以在不列出所有tag.key的情况下实现上述结果?”。因为在某些情况下,我不知道地图上有多少键。

0 个答案:

没有答案