【问题标题】:Spark dataframe get column value into a string variableSpark数据框将列值获取到字符串变量中
【发布时间】:2016-10-11 16:59:32
【问题描述】:

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

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

返回

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

如何获取价值?

【问题讨论】:

  • 赞成,因为我经常用完全不同的语言犯同样的愚蠢错误。

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


【解决方案1】:

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

x(n-1) 检索x-th 行的n-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)

【讨论】:

  • 感谢您提供答案。您能否编辑您的答案以包括对您的代码的解释?这将有助于未来的读者更好地理解正在发生的事情,尤其是那些刚接触该语言并难以理解这些概念的社区成员。
  • 我明白了……让我这样做
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      通过这个sn-p,你可以将一列中的所有值提取成一个字符串。 使用 where 子句修改 sn-p 以获得所需的值。

      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
      

      【讨论】:

        【解决方案5】:

        col("name") 为您提供列表达式。如果您想从“名称”列中提取数据,只需在没有 col("name") 的情况下执行相同操作:

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

        然后对于一行,您可以通过以下方式在 String 中获取名称:

        val name = row.getString(0)
        

        【讨论】:

        • 如何在 Python 中做到这一点?
        • 你试过 col_list = df.select('mycol').collect() 吗?
        【解决方案6】:
        val maxDate = spark.sql("select max(export_time) as export_time from  tier1_spend.cost_gcp_raw").first()
        
        val rowValue = maxDate.get(0)
        

        【讨论】:

          猜你喜欢
          • 2018-09-15
          • 2018-10-01
          • 2020-11-06
          • 2021-07-18
          • 2013-12-28
          • 2019-08-05
          • 1970-01-01
          • 1970-01-01
          • 2019-11-13
          相关资源
          最近更新 更多