Spark数据帧将列值转换为字符串变量

时间:2016-06-10 16:29:28

标签: scala apache-spark dataframe apache-spark-sql

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

 val name= test.filter(test("id").equalTo("200")).select("name").col("name")

返回

 name org.apache.spark.sql.Column = name

如何获得价值?

4 个答案:

答案 0 :(得分:14)

col("name")为您提供了列表达式。如果要从列" name"中提取数据只是在没有col("name")的情况下做同样的事情:

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

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

val name = row.getString(0)

答案 1 :(得分:1)

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

val rowValue = maxDate.get(0)

答案 2 :(得分:0)

假设您需要从下表中为特定的 name 选择 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("")

enter image description here

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

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

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

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

enter image description here

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

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

答案 3 :(得分:0)

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

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

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)