Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在Apache Spark中将Dataframe的列值提取为列表_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

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()