scala - 如何在 Spark Scala 中将 org.apache.spark.sql.ColumnName 转换为字符串、十进制类型?

标签 scala apache-spark apache-spark-sql user-defined-functions

我有一个像下面这样的 JSON

{"name":"method1","parameter1":"P1name","parameter2": 1.0}

我正在加载我的 JSON 文件
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
val df = sqlContext.read.json("C:/Users/test/Desktop/te.txt") 
scala> df.show()

+-------+----------+----------+
|   name|parameter1|parameter2|
+-------+----------+----------+
|method1|    P1name|    1.0   |
+-------+----------+----------+

我有一个像下面这样的功能:
def method1(P1:String, P2:Double)={
     |  print(P1)
         print(P2)
     | }

在执行下面的代码后,我根据列名调用我的方法1,它应该执行方法1。
import org.apache.spark.sql.Column
import org.apache.spark.sql.functions._
df.withColumn("methodCalling", when($"name" === "method1", method1($"parameter1",$"parameter2")).otherwise(when($"name" === "method2", method2($"parameter1",$"parameter2")))).show(false)

但我收到波纹管错误。

<console>:63: error: type mismatch;
 found   : org.apache.spark.sql.ColumnName
 required: String

请让我知道如何将 org.apache.spark.sql.ColumnName 数据类型转换为 String

最佳答案

当您将参数传递为

method1($"parameter1",$"parameter2")

您将列传递给函数而不是原始数据类型。所以,我建议你改变你的method1method2udf函数,如果你想在函数内部应用原始数据类型操作。和 udf函数必须为新列的每一行返回一个值。
import org.apache.spark.sql.functions._
def method1 = udf((P1:String, P2:Double)=>{
  print(P1)
  print(P2)
  P1+P2
})

def method2 = udf((P1:String, P2:Double)=>{
  print(P1)
  print(P2)
  P1+P2
})

那么你的 withColumn api 应该可以正常工作
df.withColumn("methodCalling", when($"name" === "method1", method1($"parameter1",$"parameter2")).otherwise(when($"name" === "method2", method2($"parameter1",$"parameter2")))).show(false)

注意:udf 函数执行数据序列化和反序列化以更改要按行处理的列数据类型,这会增加复杂性和大量内存使用。 spark functions应尽可能使用

关于scala - 如何在 Spark Scala 中将 org.apache.spark.sql.ColumnName 转换为字符串、十进制类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47408379/

相关文章:

scala - 在另一个数据帧的转换中创建/访问数据帧

scala - 读取保存在 HBase 列中的 AVRO 结构

python - PySpark - 如何删除 csv 输出中的科学记数法

java - 迭代 Spark 数据集的行并在 Java API 中应用操作

scala - 新 mac 上的 spark-shell 给出错误

scala - Spark Dataframe - 如何访问 json 结构

apache-spark - Spark.sql.autoBroadcastJoinThreshold 是否适用于使用数据集的联接运算符的联接?

apache-spark - 使用 Spark 从日期列中获取周末日期

scala - 创建数据框时面对 "scala.MatchError: 1201 (of class java.lang.Integer)"

scala - Spark 2.2 无法将 df 写入 parquet