scala 将DataFrameMap到case类后得到空白输出

atmip9wb  于 2023-11-18  发布在  Scala
关注(0)|答案(1)|浏览(145)

我正在尝试运行一个Spark作业。我在DF中有如下数据:

df.show()
//+------+----------+
//|  name|      rank|
//+------+----------+
//|piyush|         1|
//+------+----------+

字符串
我想把这个DFMap如下:

val ds = df.map(row=>{ConverterClass.convert(row)})


方法ConverterClass.convert

def convert(row:Row):Data = {
    Data(
        row.getAs("name"),
        row.getAs("rank")
    )
}


而case class Data

case class Data (
    var name: String,
    var rank: String
)


当我运行这个功能时,我得到一个空白的输出:

ds.show()
//++
//||
//++
//||
//++


我之前使用Java类来处理数据,并使用JavaSerializer,它工作得很好。当我改用Scala case类时,我遇到了这个问题。

kgsdhlau

kgsdhlau1#

你就快成功了!你的问题出在convert方法上。在使用getAs方法时少了一小部分。让我们看看它的签名:

def getAs[T](fieldName: String): T = getAs[T](fieldIndex(fieldName))

字符串
这里缺少了[T],这是您试图从中获取值的字段的类型。在您的情况下,两个字段的类型都是[String],正如您的case类中定义的那样。
这里是一个完全可复制的代码示例(我只是通过添加[String]来更改您的转换函数):

case class Data (
    var name: String,
    var rank: String
)

def my_convert(row:Row):Data = {
    Data(
        row.getAs[String]("name"),
        row.getAs[String]("rank"),
    )
}

val df = Seq(("piyush", "1")).toDF("name", "rank")

val ds = df.map(row=>{my_convert(row)})

scala> ds.show
+------+----+
|  name|rank|
+------+----+
|piyush|   1|
+------+----+

相关问题