首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Dataframe的列值提取为Apache Spark中的列表

将Dataframe的列值提取为Apache Spark中的列表
EN

Stack Overflow用户
提问于 2015-08-14 00:39:30
回答 10查看 287.2K关注 0票数 109

我希望将数据帧的字符串列转换为列表。我从Dataframe API中可以找到的是RDD,所以我尝试先将它转换回RDD,然后将toArray函数应用于RDD。在本例中,长度和SQL工作得很好。但是,我从RDD得到的结果在每个元素(比如这个[A00001] )周围都有方括号。我想知道是否有一种将列转换为列表的适当方法,还是删除方括号的方法。

如有任何建议,将不胜感激。谢谢!

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2015-08-14 07:49:01

这将返回包含单个列表的集合:

代码语言:javascript
复制
dataFrame.select("YOUR_COLUMN_NAME").rdd.map(r => r(0)).collect()

如果没有映射,您只会得到一个Row对象,它包含数据库中的每一列。

请记住,这可能会给您提供任何类型的列表。如果要指定结果类型,则可以在.asInstanceOfYOUR_TYPE映射中使用r => r(0).asInstanceOf[YOUR_TYPE]

由于自动转换,您可以跳过.rdd部件。

票数 130
EN

Stack Overflow用户

发布于 2017-05-20 06:44:05

使用Spark2.x和Scala2.11

我想出三种可能的方法将特定列的值转换为列表。

所有方法的通用代码段

代码语言:javascript
复制
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

代码语言:javascript
复制
df.select("id").collect().map(_(0)).toList
// res9: List[Any] = List(one, two, three)

现在会发生什么?我们正在收集数据到驱动程序的collect()和从每条记录中选择零元素。

这不可能是一种很好的方法,让我们用下一个方法来改进它。

方法2

代码语言:javascript
复制
df.select("id").rdd.map(r => r(0)).collect.toList 
//res10: List[Any] = List(one, two, three)

怎么会更好呢?我们已经在工人之间分配了地图转换负载,而不是一个驱动程序。

我知道rdd.map(r => r(0))看上去不优雅。那么,让我们在下一种方法中解决这个问题。

方法3

代码语言:javascript
复制
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种是有效和优雅的(我认为)。

数据库记事本

票数 90
EN

Stack Overflow用户

发布于 2016-09-30 23:41:23

我知道为Scala提供并询问的答案是假设的,所以我只是提供了一些Python代码片段,以防PySpark用户好奇。语法类似于给定的答案,但是要正确地弹出列表,我实际上必须在映射函数中第二次引用列名,并且我不需要select语句。

即DataFrame,包含一个名为"Raw“的列。

要获取"Raw“中的每个行值,将其组合为一个列表,其中每个条目都是来自"Raw”的行值,我只需使用:

代码语言:javascript
复制
MyDataFrame.rdd.map(lambda x: x.Raw).collect()
票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32000646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档