Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 数据帧上的操作_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 数据帧上的操作

Scala 数据帧上的操作,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我使用Spark 1.3中的DataFrame API 我希望从数据帧中的日期获取一周中的某一天,而不会丢失数据帧的所有元素 在使用DataFrameAPI之前,我曾经使用jodatime在一个简单的映射上获取它 现在有一个有效的解决方案: sqlContext.createDataFrame(myDataFrame.map(l=>operationOnTheField(l)),myDataFrame.schema)) 是否可以在不返回RDD[行]上的映射的情况下执行此操作,然后使用此R

我使用Spark 1.3中的DataFrame API

我希望从数据帧中的日期获取一周中的某一天,而不会丢失数据帧的所有元素

在使用DataFrameAPI之前,我曾经使用jodatime在一个简单的映射上获取它

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

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

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

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

import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.sql.functions._
用于设置示例
DataFrame
的case类

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()
注册一个简单的自定义项,用于转换“折扣”列

val myFunc = udf {(x: Double) => x + 1}
获取列,将自定义项应用于“折扣”列并保持其他列不变

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()生成新的
数据帧

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   
进入

你可以找到完整的例子。如果您对精确的列替换不太挑剔,则可以简化操作。

试试这个

Table.select(Table("Otherkey"),MyUdf(Table("ColNeeded")).as("UdfTransformed"))

MyUdf是您定义的udf。

例如,谢谢。在我看来,spark数据帧API中的UDF不是很优雅和直观=(
Table.select(Table("Otherkey"),MyUdf(Table("ColNeeded")).as("UdfTransformed"))