我有一个数据帧,里面有两列,已经创建了一个导入.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))
期待您对我的任何建议。提前谢谢。
我认为你有一个结构化的模式,它可以用一个数据帧来表示。数据帧支持读取 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"))
尝试
val a = b.map(row => getFormattedContentName(row(0),row(1)))
请记住,数据帧的行是它们自己的类型,而不是元组或其他东西,您需要使用正确的方法来引用它们的元素。