尝试在 Spark DataFrame 上使用映射

我最近开始尝试使用 Spark 和 Java。我最初使用了这个著名的例子,一切都如预期的那样进行。现在我正在尝试实现我自己的示例,但使用DataFrames而不是RDD。WordCountRDD

因此,我正在从文件中读取数据集

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 中找到多个非重写抽象方法。功能1

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


答案 1

如果在数据帧上使用该函数,则会返回数据帧。然后,对数据类型而不是行的值应用函数。之后,您应该首先获取该值,因此您应该执行以下操作:selectRow

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

但是您将获得RDD作为返回值而不是DF


答案 2

我使用concat来实现这一点

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

当您将同一文本映射两次时,我不确定您是否也希望替换字符串的第一部分?但如果你是,我会做的:

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

此解决方案在使用大数据时会纵向扩展,因为它将两列串联起来,而不是迭代值。


推荐