调用scala方法并将数据帧的每一行作为输入

时间:2019-01-04 03:40:32

标签: scala apache-spark apache-spark-sql

我有一个数据框,其中有两列,是通过导入.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))

期待您对我的任何建议。 预先感谢。

2 个答案:

答案 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)))

请记住,数据框的行是它们自己的类型,而不是元组或其他东西,并且您需要使用正确的方法来引用它们的元素。