我正在尝试将列值提取到变量中,以便我可以在代码中的其他位置使用该值。我正在尝试以下
val name= test.filter(test("id").equalTo("200")).select("name").col("name")
返回
name org.apache.spark.sql.Column = name
如何获得价值?
答案 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("")
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
函数,因此最有可能遇到内存不足错误(驱动程序内存)。因此,始终建议在调用 filter
函数之前应用转换(如 where
、collect
等)。如果你
仍然遇到驱动程序内存不足的问题,您可以将 --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)