在表

时间:2017-03-30 13:07:40

标签: apache-spark dataframe pyspark multiple-columns

假设:

  • 用户定义的函数,它接收一个字符串并返回多个(5)值
  • 包含一个字符串列的数据框

我从数据框中读取每一列,并以列为参数调用该函数。

输出应保存为表格。 我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

from pyspark.sql import Row
df = sc.parallelize(['a','b','c']).map(lambda row : Row(key=row)).toDF() 
df.show()

+---+
|key|
+---+
|  a|
|  b|
|  c|
+---+

def func (args):
    # function that will return 5 multiple values
    lista = Row(result=",".join([ args.key+str(x) for x in range(5)]))
    return lista

new_table = df.rdd.map(func).toDF() 
new_table.show()

+--------------+
|        result|
+--------------+
|a0,a1,a2,a3,a4|
|b0,b1,b2,b3,b4|
|c0,c1,c2,c3,c4|
+--------------+

new_table.saveAsTable("results")

答案 1 :(得分:1)

如果函数返回相同类型的值,则在Scala中:

// functions
val mySplit = (value: String) => Array(value.split(","))
val mySplitUDF = udf(mySplit(_: String))

// data
val intialDF = sparkContext.parallelize(List("First,Second,Third")).toDF("initialColumn")

// transformations
val arrayDF = intialDF.select(mySplitUDF(col("initialColumn")).as("arrayColumn"))
val expodedDF = arrayDF.select(explode(col("arrayColumn")).as("explodedCol"))

val resultDF = expodedDF.select(
  col("explodedCol").getItem(0).as("Col1"),
  col("explodedCol").getItem(1).as("Col2"),
  col("explodedCol").getItem(2).as("Col3")
)
resultDF.show(false)

结果是:

+-----+------+-----+
|Col1 |Col2  |Col3 |
+-----+------+-----+
|First|Second|Third|
+-----+------+-----+

在Python上可以用类似的方式实现