![](/img/trans.png)
[英]Need to remove string "_value" in spark dataframe column names using scala
[英]Spark dataframe get column value into a string variable
我正在嘗試將列值提取到一個變量中,以便我可以在代碼中的其他地方使用該值。 我正在嘗試如下
val name= test.filter(test("id").equalTo("200")).select("name").col("name")
它返回
name org.apache.spark.sql.Column = name
如何獲得價值?
col("name")
為您提供一個列表達式。 如果你想從列 "name" 中提取數據,只需在沒有col("name")
情況下做同樣的事情:
val names = test.filter(test("id").equalTo("200"))
.select("name")
.collectAsList() // returns a List[Row]
然后對於一行,您可以通過以下方式在字符串中獲取名稱:
val name = row.getString(0)
val maxDate = spark.sql("select max(export_time) as export_time from tier1_spend.cost_gcp_raw").first()
val rowValue = maxDate.get(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
選擇name
並將該值存儲在變量中。
+-----+-------+
| id | name |
+-----+-------+
| 100 | Alex |
| 200 | Bidan |
| 300 | Cary |
+-----+-------+
斯卡拉
-----------
先過濾掉不相關的數據,然后選擇name
列,最后存入name
變量
var name = df.filter($"id" === "100").select("name").collect().map(_.getString(0)).mkString("")
蟒蛇(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")
使用3x
版本的 Python 可能有比這更簡單的方法。 我上面顯示的代碼已經過2.7
版本的測試。
注意:
由於我們使用了collect
函數,因此最有可能遇到內存不足錯誤(驅動程序內存)。 因此,始終建議在調用collect
函數之前應用轉換(如filter
、 where
等)。 如果您仍然遇到驅動程序內存不足的問題,您可以通過--conf spark.driver.maxResultSize=0
作為命令行參數來使用無限的驅動程序內存。
s
是列值的字符串.collect()
將列/行轉換為列表數組,在這種情況下,所有行都將轉換為元組, temp
基本上是此類元組/行的數組。
x(n-1)
檢索n-th
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.