Scala 在Apache Spark中将Dataframe的列值提取为列表
我想将数据帧的字符串列转换为列表。我可以从Scala 在Apache Spark中将Dataframe的列值提取为列表,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我想将数据帧的字符串列转换为列表。我可以从DataframeAPI中找到RDD,因此我尝试先将其转换回RDD,然后将toArray函数应用于RDD。在本例中,长度和SQL工作正常。然而,我从RDD得到的结果在每个元素周围都有方括号,就像这样[A00001]。我想知道是否有合适的方法将列转换为列表,或者删除方括号 如有任何建议,将不胜感激。谢谢大家! 这将返回包含单个列表的集合: dataFrame.select("YOUR_COLUMN_NAME").rdd.map(r => r(0)).
Dataframe
API中找到RDD,因此我尝试先将其转换回RDD,然后将toArray
函数应用于RDD。在本例中,长度和SQL工作正常。然而,我从RDD得到的结果在每个元素周围都有方括号,就像这样[A00001]
。我想知道是否有合适的方法将列转换为列表,或者删除方括号
如有任何建议,将不胜感激。谢谢大家! 这将返回包含单个列表的集合:
dataFrame.select("YOUR_COLUMN_NAME").rdd.map(r => r(0)).collect()
如果没有映射,您只会得到一个Row对象,它包含数据库中的每一列
请记住,这可能会为您提供任何类型的列表。如果要指定结果类型,可以在r=>r(0)中使用.asInstanceOf[YOUR_-type]。asInstanceOf[YOUR_-type]
映射
另外,由于自动转换,您可以跳过
.rdd
部分。我知道给出的答案和要求的答案都是针对Scala的,所以我只提供一小段Python代码,以防PySpark用户好奇。语法与给定的答案类似,但要正确地弹出列表,我实际上必须在映射函数中再次引用列名,并且不需要select语句
i、 e.数据帧,包含名为“Raw”的列
要将“Raw”中的每一行值合并为一个列表,其中每个条目都是“Raw”中的一行值,我只需使用:
MyDataFrame.rdd.map(lambda x: x.Raw).collect()
使用Spark 2.x和Scala 2.11
我想有3种可能的方法将特定列的值转换为列表
所有方法的通用代码段
方法1
现在发生了什么?我们使用collect()
向驱动程序收集数据,并从每条记录中选取元素零
这不是一个很好的方法,让我们用下一种方法来改进它
方法2 怎么会更好?我们在工作人员之间分配了映射转换负载,而不是单个驱动程序 我知道
rdd.map(r=>r(0))
似乎不适合你。所以,让我们在下一种方法中解决这个问题
方法3 这里我们不是将数据帧转换为RDD。查看
map
由于数据帧中的编码器问题,它不会接受r=>r(0)
(或(0)
)作为先前的方法。因此,最终使用r=>r.getString(0)
,它将在Spark的下一个版本中得到解决
结论
所有选项都提供相同的输出,但2和3是有效的,最后第三个选项是有效和优雅的(我认为)
在Scala和Spark 2+中,尝试以下方法(假设您的列名为“s”):
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
它工作得很好
from pyspark.sql.functions import col
df.select(col("column_name")).collect()
这里是collect函数,它依次将其转换为list。
小心使用庞大数据集上的列表。这会降低性能。
检查数据很好。这是java的答案
df.select("id").collectAsList();
List which_List=df.toJavaRDD().map(新函数(){
公共字符串调用(行){
返回row.getAs(“column_name”).toString();
}
}).收集();
logger.info(String.format(“列表是%s”,无论什么列表))//验证
因为没有人用java(真正的编程语言)给出任何解决方案
请稍后感谢我更新的解决方案,它将为您提供一个列表:
dataFrame.select("YOUR_COLUMN_NAME").map(r => r.getString(0)).collect.toList
下面是Python的例子-
df.select("col_name").rdd.flatMap(lambda x: x).collect()
这将提供行对象的列表。若你们想要一个值列表呢?这是一个值列表。谢谢分享!这对我来说很好,只是想知道是否有一种方法可以加快速度,它运行得很慢,因为某种奇怪的原因,它的工作方式正好相反(Spark 2.1.0)
collect().map(r=>r(0))
-这种顺序有任何缺点吗?可能会更慢-您的解决方案首先收集驱动程序上的所有数据,之后,它只使用单个驱动程序的处理能力在驱动程序上进行映射(没有执行器的帮助)similar@VincentDoba-对于一个查询,总会有类似的答案。这是不一样的,并且没有一个答案在这个线程中使用python中的flatMap。反对票比帮助别人容易得多。无论如何。
from pyspark.sql.functions import col
df.select(col("column_name")).collect()
df.select("id").collectAsList();
List<String> whatever_list = df.toJavaRDD().map(new Function<Row, String>() {
public String call(Row row) {
return row.getAs("column_name").toString();
}
}).collect();
logger.info(String.format("list is %s",whatever_list)); //verification
dataFrame.select("YOUR_COLUMN_NAME").map(r => r.getString(0)).collect.toList
df.select("col_name").rdd.flatMap(lambda x: x).collect()