试图在Spark DataFrame上使用map

时间:2017-03-02 16:42:26

标签: java apache-spark java-8 apache-spark-sql spark-dataframe

我最近开始尝试使用Spark和Java。我最初使用WordCount完成了着名的RDD示例,一切都按预期进行。现在我试图实现我自己的例子但是使用DataFrames而不是RDD。

所以我正在使用

从文件中读取数据集
DataFrame df = sqlContext.read()
        .format("com.databricks.spark.csv")
        .option("inferSchema", "true")
        .option("delimiter", ";")
        .option("header", "true")
        .load(inputFilePath);

然后我尝试选择一个特定的列并对每一行应用一个简单的转换

df = df.select("start")
        .map(text -> text + "asd");

但是编译发现第二行的问题我不完全理解(开始列是从类型string推断出来的)。

  

在接口scala.Function1

中找到多个非重写抽象方法

为什么我的lambda函数被视为Scala函数,错误消息实际上是什么意思?

2 个答案:

答案 0 :(得分:6)

如果您在数据帧上使用select函数,则会返回数据帧。然后在Row数据类型上应用函数而不是行的值。之后你应该先得到这个值,所以你应该做到以下几点:

df.select("start").map(el->el.getString(0)+"asd")

但是你会得到一个RDD作为返回值而不是DF

答案 1 :(得分:2)

我使用concat实现这一目标

df.withColumn( concat(col('start'), lit('asd'))

当您两次映射相同的文本时,不确定是否要替换字符串的第一部分?但如果您愿意,我会这样做:

df.withColumn('start', concat(
                      when(col('start') == 'text', lit('new'))
                      .otherwise(col('start))
                     , lit('asd')
                     )

此解决方案在使用大数据时会扩大规模,因为它隐藏了两列而不是遍历值。