我想将数据帧的字符串列转换为列表 . 我可以从 Dataframe API找到的是RDD,所以我尝试先将其转换回RDD,然后将 toArray 函数应用于RDD . 在这种情况下,长度和SQL工作就好了 . 但是,我从RDD得到的结果在每个元素周围都有方括号,如 [A00001] . 我想知道是否有适当的方法将列转换为列表或删除方括号的方法 .
Dataframe
toArray
[A00001]
任何建议,将不胜感激 . 谢谢!
这应该返回包含单个列表的集合:
dataFrame.select("YOUR_COLUMN_NAME").rdd.map(r => r(0)).collect()
如果没有映射,您只需获得一个Row对象,该对象包含数据库中的每一列 .
请记住,这可能会为您提供任何类型的列表 . Ï如果要指定结果类型,可以在 r => r(0).asInstanceOf[YOUR_TYPE] 中使用.asInstanceOf [YOUR_TYPE]
r => r(0).asInstanceOf[YOUR_TYPE]
附:由于自动转换,您可以跳过 .rdd 部分 .
.rdd
我想到了将特定列的值转换为List的3种可能方法
import org.apache.spark.sql.SparkSession val spark = SparkSession.builder.getOrCreate import spark.implicits._ // for .toDf() method val df = Seq( ("first", 2.0), ("test", 1.5), ("choose", 8.0) ).toDF("id", "val")
df.select("id").collect().map(_(0)).toList // res9: List[Any] = List(one, two, three)
现在发生了什么?我们正在使用 collect() 向Driver收集数据,并从每条记录中选取元素0 .
collect()
这不是一个很好的方法,让我们用下一个方法来改进它 .
df.select("id").rdd.map(r => r(0)).collect.toList //res10: List[Any] = List(one, two, three)
它怎么样更好?我们在 Worker 之间分配了 Map 转换负载而不是单个驱动程序 .
我知道 rdd.map(r => r(0)) 看起来并不优雅 . 那么,让我们在下一个方法中解决它 .
rdd.map(r => r(0))
df.select("id").map(r => r.getString(0)).collect.toList //res11: List[String] = List(one, two, three)
这里我们不会将DataFrame转换为RDD . 由于DataFrame中的编码器问题,请查看 map 它将不接受 r => r(0) (或 _(0) )作为上一种方法 . 所以最终使用 r => r.getString(0) ,它将在下一版本的Spark中解决 .
map
r => r(0)
_(0)
r => r.getString(0)
结论所有选项都提供相同的输出,但2和3是有效的,最后第3个是有效和优雅的(我想) .
Databricks notebook link which will available till 6 months from 2017/05/20
我知道给出的答案是Scala的假设,所以我只是提供一些Python代码片段以防PySpark用户好奇 . 语法类似于给定的答案,但为了正确弹出列表,我实际上必须在映射函数中第二次引用列名,而我不需要select语句 .
即一个DataFrame,包含一个名为“Raw”的列
要将“Raw”中的每个行值合并为一个列表,其中每个条目都是“Raw”的行值,我只需使用:
MyDataFrame.rdd.map(lambda x: x.Raw).collect()
在Scala和Spark 2中,尝试这个(假设您的列名是"s"): df.select('s).as[String].collect
df.select('s).as[String].collect
sqlContext.sql(" select filename from tempTable").rdd.map(r => r(0)).collect.toList.foreach(out_streamfn.println) //remove brackets
它工作得很好
5 回答
这应该返回包含单个列表的集合:
如果没有映射,您只需获得一个Row对象,该对象包含数据库中的每一列 .
请记住,这可能会为您提供任何类型的列表 . Ï如果要指定结果类型,可以在
r => r(0).asInstanceOf[YOUR_TYPE]
中使用.asInstanceOf [YOUR_TYPE]附:由于自动转换,您可以跳过
.rdd
部分 .使用Spark 2.x和Scala 2.11
我想到了将特定列的值转换为List的3种可能方法
所有方法的公共代码片段
方法1
现在发生了什么?我们正在使用
collect()
向Driver收集数据,并从每条记录中选取元素0 .这不是一个很好的方法,让我们用下一个方法来改进它 .
方法2
它怎么样更好?我们在 Worker 之间分配了 Map 转换负载而不是单个驱动程序 .
我知道
rdd.map(r => r(0))
看起来并不优雅 . 那么,让我们在下一个方法中解决它 .方法3
这里我们不会将DataFrame转换为RDD . 由于DataFrame中的编码器问题,请查看
map
它将不接受r => r(0)
(或_(0)
)作为上一种方法 . 所以最终使用r => r.getString(0)
,它将在下一版本的Spark中解决 .Databricks notebook link which will available till 6 months from 2017/05/20
我知道给出的答案是Scala的假设,所以我只是提供一些Python代码片段以防PySpark用户好奇 . 语法类似于给定的答案,但为了正确弹出列表,我实际上必须在映射函数中第二次引用列名,而我不需要select语句 .
即一个DataFrame,包含一个名为“Raw”的列
要将“Raw”中的每个行值合并为一个列表,其中每个条目都是“Raw”的行值,我只需使用:
在Scala和Spark 2中,尝试这个(假设您的列名是"s"):
df.select('s).as[String].collect
它工作得很好