在同一个调用中从Spark Dataframes split方法中选择数组元素?

时间:2016-06-07 21:42:20

标签: python apache-spark pyspark apache-spark-sql

我正在拆分HTTP请求以查看元素,我想知道是否有办法在同一个调用中指定我想要查看的元素,而不必再进行其他操作。

例如:

from pyspark.sql import functions as fn

df.select(fn.split(df.http_request, '/').alias('http'))

给了我一个新的Dataframe,其中包含如下行的数组:

+--------------------+
|                http|
+--------------------+
|[, courses, 26420...|

我希望索引1(课程)中的项目,而不必再执行另一个select语句来指定df.select(df.http[1])或其他任何内容。这可能吗?

3 个答案:

答案 0 :(得分:12)

使用getItem。我说不要使用python UDF只是为了让代码看起来更漂亮 - 它比原生DataFrame函数慢得多(由于在python和JVM之间移动数据)。

from pyspark.sql import functions as F
df.select(F.split(df.http_request, '/').alias('http').getItem(1))

答案 1 :(得分:0)

您可以定义UDF

from pyspark.sql.functions import *
from pyspark.sql.types import *

def getter(column, index):
    return column[index]

getterUDF = udf(getter, StringType())

df.select(getterUDF(split(df.http_request, '/').alias('http'), lit(1)))

答案 2 :(得分:0)

使用selectExpr的替代方法:

df.selectExpr("http[1] as http_2nd_item")