我有一个数据框,其中有两列,是通过导入.txt文件创建的。
示例文件内容::
Sankar Biswas, Played{"94"}
Puja "Kumari" Jha, Didnot
Man Women, null
null,Gay Gentleman
null,null
创建了导入上述文件的数据框::
val a = sc.textFile("file:////Users/sankar.biswas/Desktop/hello.txt")
case class Table(contentName: String, VersionDetails: String)
val b = a.map(_.split(",")).map(p => Table(p(0).trim,p(1).trim)).toDF
现在我定义了一个函数,可以这样说::
def getFormattedName(contentName : String, VersionDetails:String): Option[String] = {
Option(contentName+titleVersionDesc)
}
现在我需要做的是获取数据帧的每一行,并调用方法getFormattedName传递数据帧每一行的2个参数。
我尝试过这种方法,但很多方法都没有解决::
val a = b.map((m,n) => getFormattedContentName(m,n))
期待您对我的任何建议。 预先感谢。
答案 0 :(得分:1)
我认为您有一个结构化的架构,可以用一个数据框表示。 数据框支持读取csv输入。
import org.apache.spark.sql.types._
val customSchema = StructType(Array(StructField("contentName", StringType, true),StructField("titleVersionDesc", StringType, true)))
val df = spark.read.schema(customSchema).csv("input.csv")
要在数据集中调用自定义方法,可以创建UDF(用户定义函数)。
def getFormattedName(contentName : String, titleVersionDesc:String): Option[String] = {
Option(contentName+titleVersionDesc)
}
val get_formatted_name = udf(getFormattedName _)
df.select(get_formatted_name($"contentName", $"titleVersionDesc"))
答案 1 :(得分:0)
尝试
val a = b.map(row => getFormattedContentName(row(0),row(1)))
请记住,数据框的行是它们自己的类型,而不是元组或其他东西,并且您需要使用正确的方法来引用它们的元素。