簡體   English   中英

Spark 數據框將列值獲取到字符串變量中

[英]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函數之前應用轉換(如filterwhere等)。 如果您仍然遇到驅動程序內存不足的問題,您可以通過--conf spark.driver.maxResultSize=0作為命令行參數來使用無限的驅動程序內存。

s是列值的字符串.collect()將列/行轉換為列表數組,在這種情況下,所有行都將轉換為元組, temp基本上是此類元組/行的數組。

x(n-1)檢索n-th x-thn-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM