Spark 结构化流/Spark SQL 中的条件爆炸

Posted

技术标签:

【中文标题】Spark 结构化流/Spark SQL 中的条件爆炸【英文标题】:Conditional Explode in Spark Structured Streaming / Spark SQL 【发布时间】:2018-06-13 00:04:06 【问题描述】:

我正在尝试在 Spark Structured Streaming 中进行条件爆炸。

例如,我的流数据帧如下所示(完全在此处制作数据)。我想在contingent = 1 时将员工数组分解为单独的数组行。 contingent = 0时,需要让数组保持原样。

|----------------|---------------------|------------------|
|     Dept ID    |     Employees       |    Contingent    |
|----------------|---------------------|------------------|
|          1     | ["John", "Jane"]    |       1          |
|----------------|---------------------|------------------|
|          4     | ["Amy", "James"]    |       0          |
|----------------|---------------------|------------------|
|          2     | ["David"]           |       1          |
|----------------|---------------------|------------------|

所以,我的输出应该是这样的(我不需要显示contingent 列:

|----------------|---------------------|
|     Dept ID    |     Employees       |
|----------------|---------------------|
|          1     | ["John"]            |
|----------------|---------------------|
|          1     | ["Jane"]            |
|----------------|---------------------|
|          4     | ["Amy", "James"]    |
|----------------|---------------------|
|          2     | ["David"]           |
|----------------|---------------------|

我目前面临几个挑战:

    有条件地分解数组 将数组分解为数组(在这种情况下不是字符串)

在 Hive 中,有一个 UDTF(用户定义的表函数)的概念可以让我这样做。想知道有没有什么可以与之媲美的?

【问题讨论】:

【参考方案1】:

使用flatMap 展开并指定您想要的任何条件。

case class Department (Dept_ID: String, Employees: Array[String], Contingent: Int)
case class DepartmentExp (Dept_ID: String, Employees: Array[String])

val ds = df.as[Department]

ds.flatMap(dept => 
  if (dept.Contingent == 1) 
    dept.Employees.map(emp => DepartmentExp(dept.Dept_ID, Array(emp)))
   else 
    Array(DepartmentExp(dept.Dept_ID, dept.Employees))
  
).as[DepartmentExp]

【讨论】:

以上是关于Spark 结构化流/Spark SQL 中的条件爆炸的主要内容,如果未能解决你的问题,请参考以下文章

[Spark]-结构化流之用法篇

将 Spark SQL 批处理源转换为结构化流接收器

Spark 结构化流文件源起始偏移量

[Spark]-结构化流之初始篇

Spark 结构化流 Kinesis 数据源

大数据(8s)Spark结构化流