簡體   English   中英

Spark中每列的值總和

[英]Sum of values per column in Spark

我需要一些關於 Spark 的幫助。

我正在做的是將我在 Spark 中得到的 dataframe 轉換為 Pandas dataframe (使用 Spark2Pandas 命令),然后對其進行一些工作,如下所示:

基本上,我有一個 Pandas dataframe 有 100 列,每列稱為“FirstP XX SecondP”,XX 是從 00 到 99 的列數。所以首先,我刪除“FirstP”和“SecondP”部分每列的文本(所以我基本上只保留數字)。 之后,使用 for 循環創建一個新列,在其中添加每列所有值的總和。 然后,我刪除了包含所有數據的原始列。

我使用的代碼如下:

data.columns = data.columns.str.replace('FirstP ', '')
data.columns = data.columns.str.replace(' SecondP', '')
data = data.dropna(how='all') # Remove NaN
data = data.astype('float')
    
    
for column in data.columns:
      column_name = f'New {column}'
      data[column_name] = data[column].sum()
      data[column_name].fillna(method='ffill', inplace=True)
      data[column_name].fillna(value=0, inplace=True)
      data = data.drop([column], axis=1)

我的問題是使用 toDF 或 Spark2Pandas 命令將 dataframe 從 Spark 轉換為 Pandas 需要很多時間,因為 dataframe 很大。 所以我想直接在 Spark 上做同樣的事情,然后將我的 dataframe(將包含列名和每列總和的值)轉換為 Pandas。

這是,而不是轉換將有 100 列和大量行的 Spark dataframe 然后使用它,我想直接在 Spark 上使用它,然后轉換我的 dataframe 將有 100 列但只有 1排。

我的問題是我對 Spark 並不是很熟悉,我已經嘗試過這樣做,但我無法讓它發揮作用。

我嘗試使用以下方法更改列的名稱:

def change_names(x):
  for column in x.columns:
      column = column.replace('FirstP ', '')
      column = column.replace(' SecondP', '')
   return x
spark_change_name = F.udf(change_names)
df1 = spark_change_name(res)
res = res.select(
[F.col(col).alias(col.replace('FirstP ', '')) for col in
res.columns])

它們似乎都不起作用。

你們中的任何人都可以幫我解決這個問題嗎?

謝謝你和親切的問候,

如果只需要一行總計,則可以將每個原始列更改為“sum(column)”,並通過空格拆分接收別名,在 Scala 中:

// original data
val df = Seq(
  (1, 2),
  (3, 4)
).toDF("FirstP 00 SecondP", "FirstP 01 SecondP")

// get columns
val totalColumns = df.columns.map(colName => sum(colName).alias(colName.split(" ")(1)))

val result = df.select(totalColumns: _*)

結果:

+---+---+
|00 |01 |
+---+---+
|4  |6  |
+---+---+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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