在Spark Dataframe中提取数组索引

时间:2018-03-09 14:29:08

标签: scala apache-spark dataframe

我有一个带有数组类型列的Dataframe 例如:

val df = List(("a", Array(1d,2d,3d)), ("b", Array(4d,5d,6d))).toDF("ID", "DATA")
df: org.apache.spark.sql.DataFrame = [ID: string, DATA: array<double>]

scala> df.show
+---+---------------+
| ID|           DATA|
+---+---------------+
|  a|[1.0, 2.0, 3.0]|
|  b|[4.0, 5.0, 6.0]|
+---+---------------+

我希望爆炸数组并使用像

这样的索引
+---+------------------+
| ID|  DATA_INDEX| DATA|
+---+------------------+
|  a|1           | 1.0 |
|  a|2           | 2.0 |
|  a|3           | 3.0 |
|  b|1           | 4.0 |
|  b|2           | 5.0 |
|  b|3           | 6.0 |
+---+------------+-----+

我希望能够用scala,Sparlyr或SparkR来做到这一点 我正在使用spark 1.6

2 个答案:

答案 0 :(得分:3)

使用Spark 1.6,您可以将数据帧注册为临时表,然后在其上运行Hive QL以获得所需的结果。

df.registerTempTable("tab")

sqlContext.sql("""
    select 
       ID, exploded.DATA_INDEX + 1 as DATA_INDEX, exploded.DATA  
    from 
       tab 
    lateral view posexplode(tab.DATA) exploded as DATA_INDEX, DATA 
""").show

+---+----------+----+
| ID|DATA_INDEX|DATA|
+---+----------+----+
|  a|         1| 1.0|
|  a|         2| 2.0|
|  a|         3| 3.0|
|  b|         1| 4.0|
|  b|         2| 5.0|
|  b|         3| 6.0|
+---+----------+----+

答案 1 :(得分:2)

spark functions

中有posexplode个功能
   import org.apache.spark.sql.functions._

   df.select("ID", posexplode($"DATA))

PS:仅在2.1.0版本

之后才可用