Scala Spark dataframe将列值获取到字符串变量中

Scala Spark dataframe将列值获取到字符串变量中,scala,dataframe,apache-spark,pyspark,apache-spark-sql,Scala,Dataframe,Apache Spark,Pyspark,Apache Spark Sql,我正在尝试将列值提取到变量中,以便可以在代码中的其他地方使用该值。我试着如下 val name= test.filter(test("id").equalTo("200")).select("name").col("name") 它回来了 name org.apache.spark.sql.Column = name 如何获取值?列(“名称”)提供一个列表达式。如果要从列“name”中提取数据,只需在不使用col(“name”)的情况下执行相同的操作即可: 然后,对于一行,您可以通过以下

我正在尝试将列值提取到变量中,以便可以在代码中的其他地方使用该值。我试着如下

 val name= test.filter(test("id").equalTo("200")).select("name").col("name")
它回来了

 name org.apache.spark.sql.Column = name
如何获取值?

列(“名称”)提供一个列表达式。如果要从列“name”中提取数据,只需在不使用
col(“name”)
的情况下执行相同的操作即可:

然后,对于一行,您可以通过以下方式获取字符串中的名称:

val name = row.getString(0)

通过此代码段,可以将列中的所有值提取为字符串。 使用where子句修改代码段以获得所需的值

val df = Seq((5, 2), (10, 1)).toDF("A", "B")

val col_val_df = df.select($"A").collect()
val col_val_str = col_val_df.map(x => x.get(0)).mkString(",")

/*
df: org.apache.spark.sql.DataFrame = [A: int, B: int]
col_val_row: Array[org.apache.spark.sql.Row] = Array([5], [10])
col_val_str: String = 5,10
*/
整列的值存储在col_val_str中

col_val_str: String = 5,10

对于任何感兴趣的人来说,下面是一种将列转换为数组的方法,对于下面的情况,我们只取第一个值

val names= test.filter(test("id").equalTo("200")).selectExpr("name").rdd.map(x=>x.mkString).collect
val name = names(0)

假设您需要从下表中为特定的
Id
选择
名称
,并将该值存储在变量中

+-----+-------+
| id  | name  |
+-----+-------+
| 100 | Alex  |
| 200 | Bidan |
| 300 | Cary  |
+-----+-------+
SCALA
------------

首先过滤掉不相关的数据,然后选择
name
列,最后存储到
name
变量中

var name = df.filter($"id" === "100").select("name").collect().map(_.getString(0)).mkString("")

PYTHON(PYSPARK)
-------------------------------------

为了更简单的使用,我创建了一个函数,通过将dataframe和所需的列名传递给它来返回值(这是spark dataframe,而不是Pandas dataframe)。在将数据帧传递给此函数之前,
filter
用于过滤掉其他记录

def GetValueFromDataframe(_df,columnName):
    for row in _df.rdd.collect():       
        return row[columnName].strip()

name = GetValueFromDataframe(df.filter(df.id == "100"),"name")

使用
3x
版本的Python可能有比这更简单的方法。我上面展示的代码是针对
2.7
版本进行测试的

注意:
由于我们使用
collect
功能,很可能会遇到内存不足错误(驾驶员内存)。因此,在调用
collect
函数之前,建议始终应用转换(如
filter
where
等)。如果你
仍然会遇到驱动程序内存不足的问题,您可以将
--conf spark.driver.maxResultSize=0作为命令行参数传递,以使用无限的驱动程序内存。

s
是列值字符串
.collect()
将列/行转换为列表数组,在这种情况下,所有行都将转换为元组,
temp
基本上是此类元组/行的数组

x(n-1)
检索
x-th
行的
n-th
列值,该列值默认为“Any”类型,因此需要转换为字符串,以便附加到现有strig

s =""
// say the n-th column is the target column 
val temp = test.collect() // converts Rows to array of list 
temp.foreach{x => 
            s += (x(n-1).asInstanceOf[String])   
        }

println(s)

因为我经常在完全不同的语言中犯同样愚蠢的错误而提高投票率。我如何在Python中做到这一点?您是否尝试过col_list=df.select('mycl').collect()?感谢您提供了答案。请编辑您的答案,包括对代码的解释,好吗?这将有助于未来的读者更好地理解正在发生的事情,尤其是那些对这门语言不熟悉并努力理解这些概念的社区成员。我明白了。。。让我来吧
def GetValueFromDataframe(_df,columnName):
    for row in _df.rdd.collect():       
        return row[columnName].strip()

name = GetValueFromDataframe(df.filter(df.id == "100"),"name")
s =""
// say the n-th column is the target column 
val temp = test.collect() // converts Rows to array of list 
temp.foreach{x => 
            s += (x(n-1).asInstanceOf[String])   
        }

println(s)