数据框的操作

jna*_*our 7 scala apache-spark apache-spark-sql

我使用Spark 1.3的DataFrame API.

我想从DataFrame中的日期获取星期几,而不会丢失DataFrame的所有元素.

在使用DataFrame API之前,我曾经使用jodatime将其放在简单的地图上.

现在有一个有效的解决方案:

sqlContext.createDataFrame(myDataFrame.map(l=>operationOnTheField(l)),myDataFrame.schema))
Run Code Online (Sandbox Code Playgroud)

是否可以在不返回映射的情况下执行操作RDD[Row],然后使用此RDD创建DataFrame?

Spi*_*lov 10

您可以使用电话的组合select()DataFrame和用户定义的函数(UDF)有关转换列.

import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.sql.functions._
Run Code Online (Sandbox Code Playgroud)

用于设置示例的案例类DataFrame.

private case class Cust(id: Integer, name: String, 
        sales: Double, discount: Double, state: String)
Run Code Online (Sandbox Code Playgroud)

然后设置一个SQLContext并创建DataFrame如下:

import sqlContext.implicits._

val custs = Seq(
  Cust(1, "Widget Co", 120000.00, 0.00, "AZ"),
  Cust(2, "Acme Widgets", 410500.00, 500.00, "CA"),
  Cust(3, "Widgetry", 410500.00, 200.00, "CA"),
  Cust(4, "Widgets R Us", 410500.00, 0.0, "CA"),
  Cust(5, "Ye Olde Widgete", 500.00, 0.0, "MA")
)
val customerDF = sc.parallelize(custs, 4).toDF()
Run Code Online (Sandbox Code Playgroud)

注册一个简单的UDF,用于转换"折扣"列.

val myFunc = udf {(x: Double) => x + 1}
Run Code Online (Sandbox Code Playgroud)

获取列,将UDF应用到"折扣"列并将其他列保留原样.

val colNames = customerDF.columns
val cols = colNames.map(cName => customerDF.col(cName))
val theColumn = customerDF("discount")
Run Code Online (Sandbox Code Playgroud)

我想找到一种"更好"的方式匹配该列,但以下工作.用于as()为列添加新名称,因为我们可以!

val mappedCols = cols.map(c => 
  if (c.toString() == theColumn.toString()) myFunc(c).as("transformed") else c)
Run Code Online (Sandbox Code Playgroud)

使用select()生成新的 DataFrame

val newDF = customerDF.select(mappedCols:_*)
Run Code Online (Sandbox Code Playgroud)

你变了

id name            sales    discount state
1  Widget Co       120000.0 0.0      AZ   
2  Acme Widgets    410500.0 500.0    CA   
3  Widgetry        410500.0 200.0    CA   
4  Widgets R Us    410500.0 0.0      CA   
5  Ye Olde Widgete 500.0    0.0      MA   
Run Code Online (Sandbox Code Playgroud)

id name            sales    transformed state
1  Widget Co       120000.0 1.0         AZ   
2  Acme Widgets    410500.0 501.0       CA   
3  Widgetry        410500.0 201.0       CA   
4  Widgets R Us    410500.0 1.0         CA   
5  Ye Olde Widgete 500.0    1.0         MA   
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到完整的示例源代码.如果您对精确的色谱柱更换不挑剔,可以使其更简单.

  • 谢谢你举个例子.从我的观点来看,UDF的火花数据框架API不是很优雅和直观=( (2认同)

sky*_*ytx 1

尝试这个

Table.select(Table("Otherkey"),MyUdf(Table("ColNeeded")).as("UdfTransformed"))
Run Code Online (Sandbox Code Playgroud)

MyUdf是你定义的udf。