it-swarm.com.ru

Как применить функцию к столбцу Spark DataFrame?

Давайте предположим, что у нас есть Spark DataFrame

df.getClass
Class[_ <: org.Apache.spark.sql.DataFrame] = class org.Apache.spark.sql.DataFrame

со следующей схемой

df.printSchema
root
|-- rawFV: string (nullable = true)
|-- tk: array (nullable = true)
|    |-- element: string (containsNull = true)

Учитывая, что каждая строка столбца tk является массивом строк, как написать функцию Scala, которая будет возвращать количество элементов в каждой строке?

7
ranlot

Вам не нужно писать пользовательскую функцию, потому что она есть:

import org.Apache.spark.sql.functions.size

df.select(size($"tk"))

Если вы действительно хотите, вы можете написать udf:

import org.Apache.spark.sql.functions.udf

val size_ = udf((xs: Seq[String]) => xs.size)

или даже создать пользовательское выражение, но в этом нет никакого смысла.

12
zero323

Один из способов - получить к ним доступ с помощью sql, как показано ниже. 

df.registerTempTable("tab1")
val df2 = sqlContext.sql("select tk[0], tk[1] from tab1")

df2.show()

Чтобы получить размер столбца массива, 

val df3 = sqlContext.sql("select size(tk) from tab1")
df3.show()

Если ваша версия Spark старше, вы можете использовать HiveContext вместо SQL-контекста Spark. 

Я также попробовал бы кое-что, что проходит.

1
Srini