從 Spark 的 DataFrame 中取出具體某一行詳解
導讀 | Spark 中 DataFrame 是 RDD 的擴充套件,限於其分散式與彈性記憶體特性,我們沒法直接進行類似 df.iloc(r, c) 的操作來取出其某一行。 |
如何從 Spark 的 DataFrame 中取出具體某一行?
根據阿里專家Spark的DataFrame不是真正的DataFrame-秦續業的文章
DataFrame 應該有『保證順序,行列對稱』等規律
因此「Spark DataFrame 和 Koalas 不是真正的 DataFrame」
確實可以執行,但卻看到一句話,大意是資料會被放到一個分割槽來執行,這正是因為資料本身之間並不保證順序,因此只能把資料收集到一起,排序,再呼叫 shift。這樣就不再是一個分散式的程式了,甚至比 pandas 本身更慢。
我們可以明確一個前提:Spark 中 DataFrame 是 RDD 的擴充套件,限於其分散式與彈性記憶體特性,我們沒法直接進行類似 df.iloc(r, c) 的操作來取出其某一行。
但是現在我有個需求,分箱,具體來講,需要『排序後遍歷每一行及其鄰居比如 i 與 i+j』,因此,我們必須能夠獲取資料的某一行!
不知道有沒有高手有好的方法?我只想到了以下幾招!
collect 是將 DataFrame 轉換為陣列放到記憶體中來。但是 Spark 處理的資料一般都很大,直接轉為陣列,會爆記憶體。
因此不能直接 collect 。
要處理哪一列,就直接 select('列名') 取出這一列就好,再 collect 。我的資料有 2e5 * 2e4 這麼多,因此 select 後只剩一列大小為 2e5 * 1 ,還是可以 collect 的。
這顯然不是個好方法!因為無法處理真正的大資料,比如行很多時。
給 DataFrame 例項 .sort("列名") 後,用 SQL 語句查詢:
select 列名 from df_table where 索引列名 = i
我對於 SQL 不是很瞭解,因此這個做法只是在構思階段。
此外,我不清楚 SQL 的效能!我要呼叫很多次 df.iloc[i, 列] ,那這樣會不會太慢了?
這個想法也只是停留在腦子裡!因為會有些難度。
給每一行加索引列,從0開始計數,然後把矩陣轉置,新的列名就用索引列來做。
之後再取第 i 個數,就 df(i.toString) 就行。
這個方法似乎靠譜。
附加方案:ml.feature.Bucketizer
import org.apache.spark.ml.feature.{Bucketizer, QuantileDiscretizer}
spark中 Bucketizer 的作用和我實現的需求差不多(儘管細節不同),我猜測其中也應該有相似邏輯。有能力和精力了應該去讀讀原始碼,看看官方怎麼實現的。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2784526/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Excel技巧—如何從重複行中取某一行Excel
- Spark SQL中的RDD與DataFrame轉換SparkSQL
- Spark建立空的DataFrameSpark
- 詳解 Spark 中的 BucketingSpark
- pandas | 詳解DataFrame中的apply與applymap方法APP
- Spark DataFrame的groupBy vs groupByKeySpark
- Spark API 全集(1):Spark SQL Dataset & DataFrame APISparkAPISQL
- SparkSQL /DataFrame /Spark RDD誰快?SparkSQL
- spark dataframe 型別轉換Spark型別
- 15、Spark Sql(一),生成DataFrame的方式SparkSQL
- panda.DataFrame.loc 使用詳解
- Apache Spark 記憶體管理詳解ApacheSpark記憶體
- Spark SQL學習——DataFrame和DataSetSparkSQL
- Apache Spark Dataframe Join語法教程ApacheSpark
- java 讀取指定某一行的文字Java
- Spark Parquet詳解Spark
- spark: RDD與DataFrame之間的相互轉換Spark
- 【Spark篇】---SparkSQL初始和建立DataFrame的幾種方式SparkSQL
- Spark Metrics配置詳解Spark
- Spark 原始碼系列(九)Spark SQL 初體驗之解析過程詳解Spark原始碼SQL
- 【Spark】 Spark作業執行原理--獲取執行結果Spark
- Spark的兩種核心Shuffle詳解Spark
- Spark SQL,如何將 DataFrame 轉為 json 格式SparkSQLJSON
- 詳解GaussDB(DWS)中的行執行引擎
- 《深入理解Spark》之Spark的整體執行流程Spark
- Spark註冊UDF函式,用於DataFrame DSL or SQLSpark函式SQL
- Spark 3.x Spark Core詳解 & 效能優化Spark優化
- Spark修煉之道(進階篇)——Spark入門到精通:第八節 Spark SQL與DataFrame(一)SparkSQL
- Spark RDD使用詳解--RDD原理Spark
- Python中建立DataFrame的方法Python
- Java中的多執行緒詳解Java執行緒
- Java中的執行緒同步詳解Java執行緒
- Swift 中的記憶體管理詳解Swift記憶體
- Java中的記憶體模型詳解Java記憶體模型
- Spark RDD詳解 | RDD特性、lineage、快取、checkpoint、依賴關係Spark快取
- 大白話講解Spark中的RDDSpark
- .net跳過某一箇中介軟體,在中介軟體中獲取自定義註解Attribute進行判斷。
- Android中圖片的三層快取詳解Android快取