在火花壳中插入行

时间:2016-11-14 07:40:28

标签: scala apache-spark

假设我有像

这样的数据集
Name   | Start_Year| End_Year
Steven | 1995      | 1999
Ema    | 2000      | 2004
Hope   | 2005      | 2006

输出应该是:

Name   | Year 
Steven | 1995
Steven | 1996
Steven | 1997
Steven | 1998
Steven | 1999
Ema    | 2000
Ema    | 2001
Ema    | 2002
Ema    | 2003
Ema    | 2004
Hope   | 2005
Hope   | 2006

我怎样才能实现这一目标?

1 个答案:

答案 0 :(得分:1)

您可以使用UDF将开始年份和结束年份转换为范围内所有年份的数组,然后使用explode将该数组中的每个项目转换为一行:

import org.apache.spark.sql.functions._
val toRange = udf { (y1: Int, y2: Int) => (y1 to y2).toArray }

input
  .withColumn("years", toRange($"Start_Year", $"End_Year"))
  .select($"Name", explode($"years") as "Year")