我最近开始尝试使用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函数,错误消息实际上是什么意思?
答案 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')
)
此解决方案在使用大数据时会扩大规模,因为它隐藏了两列而不是遍历值。