gpt4 book ai didi

scala - 对数据框的操作

转载 作者:行者123 更新时间:2023-12-03 07:11:57 25 4
gpt4 key购买 nike

我使用 Spark 1.3 中的 DataFrame API。

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

在使用 DataFrame API 之前,我曾经使用 jodatime 在简单的 map 上获取它。

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

sqlContext.createDataFrame(myDataFrame.map(l=>operationOnTheField(l)),myDataFrame.schema))

是否可以在不返回到RDD[Row]上的 map 的情况下执行该操作,然后使用该RDD创建一个DataFrame?

最佳答案

您可以结合使用对 DataFrame 调用 select() 和用户定义函数 (UDF) 来转换相关列。

import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.sql.functions._

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

private case class Cust(id: Integer, name: String, 
sales: Double, discount: Double, state: String)

然后设置 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()

注册一个简单的 UDF,用于转换“折扣”列。

val myFunc = udf {(x: Double) => x + 1}

获取列,将 UDF 应用到“折扣”列并保留其他列不变。

val colNames = customerDF.columns
val cols = colNames.map(cName => customerDF.col(cName))
val theColumn = customerDF("discount")

我想找到一种“更好”的方式来匹配该列,但以下方法有效。使用 as() 为列指定一个新名称,因为我们可以!

val mappedCols = cols.map(c => 
if (c.toString() == theColumn.toString()) myFunc(c).as("transformed") else c)

使用 select() 生成新的 DataFrame

val newDF = customerDF.select(mappedCols:_*)

你变了

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

进入

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

您可以找到完整的示例 source code here 。如果您对精确的色谱柱更换不挑剔,则可以使其变得更简单。

关于scala - 对数据框的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29151348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com