【问题标题】:exploding an spark data frame column which is in the form of array爆炸数组形式的火花数据框列
【发布时间】:2018-06-19 00:44:10
【问题描述】:

我有一个 spark 数据框:

Id   |   events
----------------
A    |  [{"itemIds":["1","21","3"],"eventtype":"sp"},{"eventtype":"hp"},{"itemIds":["5"],"eventtype":"ip"}]

B    |  [{"itemIds":["8","10"],"eventtype":"bp"},{"eventtype":"atc"}]

这里 Id 和 events 列都是字符串类型。

如何将上面的数据框转换为下面的数据框(如果“itemIds”不存在,则填充为空值):

Id    |  itemIds  |   eventtype
---------------------------------

A     |     1     |     sp

A     |     21    |     sp

A     |     3     |     sp

A     |    null   |     hp

A     |     5     |     ip

B     |     8     |     bp

B     |     10    |     bp

B     |     null  |     atc

这里Id、itemIds、事件类型列都是String类型。

【问题讨论】:

  • 您是否在 Dataframe 或类似的 questions 上寻找过 API 方法?

标签: apache-spark dataframe


【解决方案1】:

这是解决方案,其中使用 json4j 解析 json 然后分解项目。

implicit val formats = org.json4s.DefaultFormats

case class Items(itemIds: Array[String], eventtype: String)
case class Item(id: String, itemId: String, etype: String)

val df = Seq(("A","""[{"itemIds":["1","21","3"],"eventtype":"sp"},{"eventtype":"hp"},{"itemIds":["5"],"eventtype":"ip"}]"""),("B","""[{"itemIds":["8","10"],"eventtype":"bp"},{"eventtype":"atc"}]""")).toDF("id","json")

df.flatMap(r => {
  implicit val formats = org.json4s.DefaultFormats
  org.json4s.jackson.JsonMethods.parse(r.getString(1)).extract[Array[Items]].flatMap(i => {
    if(i.itemIds.isEmpty)
      List(Item(r.getString(0), null, i.eventtype))
    else
      (0 until i.itemIds.size).map(j => Item(r.getString(0), i.itemIds(j), i.eventtype))
  })
})

【讨论】:

    猜你喜欢
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 2019-01-15
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多