2016-01-05 28 views
5

Giả sử rằng chúng ta có một Spark DataFrameLàm thế nào để áp dụng một chức năng cho một cột của một DataFrame Spark?

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

với giản đồ sau

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

Cho rằng mỗi hàng của cột tk là một mảng các chuỗi, làm thế nào để viết một hàm Scala rằng sẽ trả về số lượng các phần tử trong mỗi hàng?

Trả lời

10

Bạn không cần phải viết một chức năng tùy chỉnh vì có một:

import org.apache.spark.sql.functions.size 

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

Nếu bạn thực sự muốn bạn có thể viết một udf:

import org.apache.spark.sql.functions.udf 

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

hoặc thậm chí tạo tùy chỉnh một biểu thức nhưng thực sự không có điểm nào trong đó.

+0

Hoàn hảo! Đối với tính tổng quát, tôi muốn biết cách áp dụng một UDF cho một khung dữ liệu. Bạn có thể chỉ cho tôi một ví dụ đơn giản không? – ranlot

+0

Có hàng tá ví dụ về SO ([một vài ví dụ] (https://stackoverflow.com/search?q=user%3A1560062+import+org.apache.spark.sql.functions.udf+ [apache-spark])) và như luôn luôn nguồn (đặc biệt là kiểm tra) là nơi tốt để bắt đầu. – zero323

+0

Bạn sẽ sử dụng hàm size_ này như thế nào? – ranlot

1

Một cách là truy cập chúng bằng cách sử dụng sql như dưới đây.

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

df2.show() 

Để có được kích thước của cột mảng,

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

Nếu phiên bản Spark của bạn là cũ hơn, bạn có thể sử dụng HiveContext thay vì bối cảnh SQL Spark.

Tôi cũng sẽ thử một số điều đi ngang qua.

Các vấn đề liên quan