我希望将数据帧的字符串列转换为列表。我从Dataframe API中可以找到的是RDD,所以我尝试先将它转换回RDD,然后将toArray函数应用于RDD。在本例中,长度和SQL工作得很好。但是,我从RDD得到的结果在每个元素(比如这个[A00001] )周围都有方括号。我想知道是否有一种将列转换为列表的适当方法,还是删除方括号的方法。
如有任何建议,将不胜感激。谢谢!
发布于 2015-08-14 07:49:01
这将返回包含单个列表的集合:
dataFrame.select("YOUR_COLUMN_NAME").rdd.map(r => r(0)).collect()如果没有映射,您只会得到一个Row对象,它包含数据库中的每一列。
请记住,这可能会给您提供任何类型的列表。如果要指定结果类型,则可以在.asInstanceOfYOUR_TYPE映射中使用r => r(0).asInstanceOf[YOUR_TYPE]
由于自动转换,您可以跳过.rdd部件。
发布于 2017-05-20 06:44:05
使用Spark2.x和Scala2.11
我想出三种可能的方法将特定列的值转换为列表。
所有方法的通用代码段
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")方法1
df.select("id").collect().map(_(0)).toList
// res9: List[Any] = List(one, two, three)现在会发生什么?我们正在收集数据到驱动程序的collect()和从每条记录中选择零元素。
这不可能是一种很好的方法,让我们用下一个方法来改进它。
方法2
df.select("id").rdd.map(r => r(0)).collect.toList
//res10: List[Any] = List(one, two, three)怎么会更好呢?我们已经在工人之间分配了地图转换负载,而不是一个驱动程序。
我知道rdd.map(r => r(0))看上去不优雅。那么,让我们在下一种方法中解决这个问题。
方法3
df.select("id").map(r => r.getString(0)).collect.toList
//res11: List[String] = List(one, two, three)这里我们没有将DataFrame转换为RDD。看看map,由于DataFrame中的编码器问题,它不会接受r => r(0)(或_(0))作为前一种方法。因此,最终使用r => r.getString(0),它将在下一个版本的Spark中得到解决。
结论
所有选项都提供相同的输出,但2和3是有效的,最后第3种是有效和优雅的(我认为)。
发布于 2016-09-30 23:41:23
我知道为Scala提供并询问的答案是假设的,所以我只是提供了一些Python代码片段,以防PySpark用户好奇。语法类似于给定的答案,但是要正确地弹出列表,我实际上必须在映射函数中第二次引用列名,并且我不需要select语句。
即DataFrame,包含一个名为"Raw“的列。
要获取"Raw“中的每个行值,将其组合为一个列表,其中每个条目都是来自"Raw”的行值,我只需使用:
MyDataFrame.rdd.map(lambda x: x.Raw).collect()https://stackoverflow.com/questions/32000646
复制相似问题