Spark数据帧将列值获取为字符串变量

G G*_*G G 14 scala dataframe apache-spark apache-spark-sql

我正在尝试将列值提取到变量中,以便我可以在代码中的其他位置使用该值.我想尝试如下

 val name= test.filter(test("id").equalTo("200")).select("name").col("name")
Run Code Online (Sandbox Code Playgroud)

它回来了

 name org.apache.spark.sql.Column = name
Run Code Online (Sandbox Code Playgroud)

如何获得价值?

Yua*_* JI 19

col("name")给你一个列的数据类型.如果要从"name"列中提取数据,只需执行相同的操作即可col("name"):

val names = test.filter(test("id").equalTo("200"))
                .select("name")
                .collectAsList() // returns a List[Row]
Run Code Online (Sandbox Code Playgroud)

然后,对于一行,您可以在String中获取名称:

val name = row.getString(0)
Run Code Online (Sandbox Code Playgroud)


Raj*_*ngh 9

val maxDate = spark.sql("select max(export_time) as export_time from  tier1_spend.cost_gcp_raw").first()

val rowValue = maxDate.get(0)
Run Code Online (Sandbox Code Playgroud)


Sar*_*avu 7

让我们假设您需要name从下表中选择特定Id值并将该值存储在变量中。

+-----+-------+
| id  | name  |
+-----+-------+
| 100 | Alex  |
| 200 | Bidan |
| 300 | Cary  |
+-----+-------+
Run Code Online (Sandbox Code Playgroud)

SCALA
-----------

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

var name = df.filter($"id" === "100").select("name").collect().map(_.getString(0)).mkString("")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

蟒蛇(PYSPARK)
----------------------------

为了更简单地使用,我创建了一个函数,通过将数据帧和所需的列名称传递给它来返回值(这是 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")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

可能有比使用3xPython 版本更简单的方法。我上面显示的代码已经过2.7版本测试。

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


小智 5

通过此代码片段,您可以将列中的所有值提取到字符串中。使用 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
*/
Run Code Online (Sandbox Code Playgroud)

整个列的值存储在 col_val_str 中

col_val_str: String = 5,10
Run Code Online (Sandbox Code Playgroud)