Spark 中創建 DataFrame 的2種方式對比

spark.createDataFrame(data).toDF("name", "age")

spark.createDataFrame(spark.sparkContext.parallelize(data), schema)

創建df的方式有什么區別?

在 Spark 中,創建 DataFrame 的方式有多種,其中兩種常見的方式是:

  1. spark.createDataFrame(data).toDF("name", "age")

  2. spark.createDataFrame(spark.sparkContext.parallelize(data), schema)

這兩種方式的主要區別在于?數據來源?和?模式(Schema)的定義方式。下面詳細分析它們的區別和適用場景。


1.?spark.createDataFrame(data).toDF("name", "age")

特點
  • 數據來源data?是一個本地集合(如?Seq?或?List),Spark 會將其并行化為分布式數據集(RDD)。

  • 模式推斷:Spark 會自動推斷數據的模式(Schema),并根據列的順序為列命名。

  • 列名指定:通過?toDF("name", "age")?顯式指定列名。

示例
import org.apache.spark.sql.SparkSessionval spark = SparkSession.builder().appName("DataFrame Example").master("local[*]").getOrCreate()// 數據是一個本地集合
val data = Seq(("Alice", 25), ("Bob", 30), ("Charlie", 35))// 創建 DataFrame,并指定列名
val df = spark.createDataFrame(data).toDF("name", "age")df.show()

輸出:

+-------+---+
|   name|age|
+-------+---+
|  Alice| 25|
|    Bob| 30|
|Charlie| 35|
+-------+---+
適用場景
  • 數據量較小,可以直接在本地集合中定義。

  • 不需要顯式定義復雜的模式(Schema)。

  • 列名可以通過?toDF?簡單指定。


2.?spark.createDataFrame(spark.sparkContext.parallelize(data), schema)

特點
  • 數據來源data?是一個本地集合,通過?spark.sparkContext.parallelize(data)?將其顯式轉換為 RDD。

  • 模式定義:需要顯式定義一個模式(StructType),指定每列的名稱和數據類型。

  • 靈活性:適合處理復雜的數據結構(如嵌套結構體)。

示例
import org.apache.spark.sql.{SparkSession, Row}
import org.apache.spark.sql.types._val spark = SparkSession.builder().appName("DataFrame Example").master("local[*]").getOrCreate()// 數據是一個本地集合,每個元素是一個 Row 對象
val data = Seq(Row("Alice", 25),Row("Bob", 30),Row("Charlie", 35)
)// 定義模式
val schema = new StructType().add(StructField("name", StringType, nullable = false)).add(StructField("age", IntegerType, nullable = false))// 創建 DataFrame
val df = spark.createDataFrame(spark.sparkContext.parallelize(data), schema)df.show()

輸出:

+-------+---+
|   name|age|
+-------+---+
|  Alice| 25|
|    Bob| 30|
|Charlie| 35|
+-------+---+
適用場景
  • 數據量較大,需要顯式并行化為 RDD。

  • 數據結構復雜,需要顯式定義模式(Schema)。

  • 需要更精確地控制列的數據類型和是否允許為空。


3.?主要區別

特性spark.createDataFrame(data).toDF("name", "age")spark.createDataFrame(spark.sparkContext.parallelize(data), schema)
數據來源本地集合(自動并行化為 RDD)本地集合(顯式并行化為 RDD)
模式定義自動推斷模式需要顯式定義模式(StructType
列名指定通過?toDF?指定列名在模式中定義列名
數據類型控制自動推斷數據類型可以顯式指定每列的數據類型
是否允許為空默認允許為空可以顯式指定是否允許為空
適用場景簡單數據結構,數據量較小復雜數據結構,數據量較大

4.?選擇哪種方式?

  • 使用?spark.createDataFrame(data).toDF("name", "age")?的情況

    • 數據量較小,可以直接在本地集合中定義。

    • 數據結構簡單,不需要顯式定義模式。

    • 列名可以通過?toDF?簡單指定。

  • 使用?spark.createDataFrame(spark.sparkContext.parallelize(data), schema)?的情況

    • 數據量較大,需要顯式并行化為 RDD。

    • 數據結構復雜,需要顯式定義模式。

    • 需要精確控制列的數據類型和是否允許為空。


5.?復雜數據結構示例

如果需要處理嵌套結構體(如數組或結構體),推薦使用顯式定義模式的方式。

示例:嵌套結構體
import org.apache.spark.sql.{SparkSession, Row}
import org.apache.spark.sql.types._val spark = SparkSession.builder().appName("Nested DataFrame Example").master("local[*]").getOrCreate()// 數據是一個本地集合,包含嵌套結構
val data = Seq(Row("Alice", Row("Java", 5)),Row("Bob", Row("Python", 4))
)// 定義模式
val schema = new StructType().add(StructField("name", StringType, nullable = false)).add(StructField("skill", new StructType().add(StructField("name", StringType, nullable = false)).add(StructField("level", IntegerType, nullable = false))))// 創建 DataFrame
val df = spark.createDataFrame(spark.sparkContext.parallelize(data), schema)df.printSchema()
df.show()

輸出:

root|-- name: string (nullable = false)|-- skill: struct (nullable = false)|    |-- name: string (nullable = false)|    |-- level: integer (nullable = false)+-----+----------+
| name|     skill|
+-----+----------+
|Alice| [Java, 5]|
|  Bob|[Python, 4]|
+-----+----------+

總結

  • spark.createDataFrame(data).toDF("name", "age"):適合簡單場景,自動推斷模式。

  • spark.createDataFrame(spark.sparkContext.parallelize(data), schema):適合復雜場景,顯式定義模式。

根據數據結構和需求選擇合適的方式即可!如果還有其他問題,歡迎繼續提問。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897914.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897914.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897914.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

六十天前端強化訓練之第十七天React Hooks 入門:useState 深度解析

歡迎來到編程星辰海的博客講解 看完可以給一個免費的三連嗎,謝謝大佬! 目錄 一、知識講解 1. Hooks 是什么? 2. useState 的作用 3. 基本語法解析 4. 工作原理 5. 參數詳解 a) 初始值設置方式 b) 更新函數特性 6. 注意事項 7. 類組…

IEC61850標準下MMS 緩存報告控制塊 ResvTms詳細解析

IEC61850標準是電力系統自動化領域唯一的全球通用標準。IEC61850通過標準的實現,使得智能變電站的工程實施變得規范、統一和透明,這大大提高了變電站自動化系統的技術水平和安全穩定運行水平。 在 IEC61850 標準體系中,ResvTms(r…

【JVM】GC 常見問題

GC 常見問題 哪些情況新生代會進入老年代 新生代 GC 后幸存區(survivor)不夠存放存活下來的對象,會通過內存擔保機制晉升到老年代。大對象直接進入老年代,因為大對象再新生代之間來會復制會影響 GC 性能。由 -XX:PretenureSizeT…

Audacity 技術淺析(一)

Audacity 是一個開源的音頻編輯工具,雖然它主要用于音頻編輯和處理,但也可以通過一些插件和功能實現基本的音頻生成功能。 1. Audacity 的音頻生成基礎 Audacity 的音頻生成主要依賴于其內置的生成器、效果器以及 Nyquist 編程語言。這些工具允許用戶創…

G-Star 公益行起航,揮動開源技術點亮公益!

公益組織,一直是社會溫暖的傳遞者,但在數字化浪潮中,也面臨著諸多比大眾想象中復雜的挑戰:項目管理如何更高效?志愿者管理又該如何創新?宣傳推廣怎么才能更有影響力?內部管理和技術支持又該如何…

MongoDB 數據導出與導入實戰指南(附完整命令)

1. 場景說明 在 MongoDB 運維中,數據備份與恢復是核心操作。本文使用 mongodump 和 mongorestore 工具,演示如何通過命令行導出和導入數據,解決副本集連接、路徑指定等關鍵問題。 2. 數據導出(mongodump) 2.1 導出命…

京東 h5st 5.1 分析

聲明: 本文章中所有內容僅供學習交流使用,不用于其他任何目的,抓包內容、敏感網址、數據接口等均已做脫敏處理,嚴禁用于商業用途和非法用途,否則由此產生的一切后果均與作者無關! 逆向分析 學習了2天某物,f…

CentOS 系統安裝 docker 以及常用插件

博主用的的是WindTerm軟件鏈接的服務器,因為好用 1.鏈接上服務器登入后,在/root/目錄下 2.執行以下命令安裝docker sudo yum install -y yum-utilssudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.reposudo…

不像人做的題————十四屆藍橋杯省賽真題解析(上)A,B,C,D題解析

題目A:日期統計 思路分析: 本題的題目比較繁瑣,我們采用暴力加DFS剪枝的方式去做,我們在DFS中按照8位日期的每一個位的要求進行初步剪枝找出所有的八位子串,但是還是會存在19月的情況,為此還需要在CHECK函數…

【redis】set 類型:基本命令

文章目錄 基本概念SADD 和 SMEMBERSSCARDSPOPSRANDMEMBERSMOVESREM集合間操作SINTERSINTERSTORESUNIONSUNIONSTORESDIFFSDIFFSTORE 命令小結內部編碼 基本概念 談到一個屬于,這個術語可能有多種含義,set 集合設置(和 get 相對應&#xff09…

C 語言進【進階篇】之動態內存管理:從底層機制到實戰優化

目錄 🚀前言🌟動態內存分配的必要性🤔動態內存分配函數深度剖析💯malloc函數:內存申請的主力軍💯free函數:釋放內存的“清道夫”💯calloc函數:初始化內存的利器&#x1f…

2023華東師范大學計算機復試上機真題

2023華東師范大學計算機復試上機真題 2022華東師范大學計算機復試上機真題 2021華東師范大學計算機復試上機真題 2023華東師范大學計算機復試機試真題 2022華東師范大學計算機復試機試真題 2021華東師范大學計算機復試機試真題 在線評測:傳送門:pgcode.…

Mac下安裝Zed以及Zed對MCP(模型上下文協議)的支持

Zed是當前新流行的一種編輯器,支持MCP(模型上下文協議) Mac下安裝Zed比較簡單,直接有安裝包,在這里: brew install --cask zedMac Monterey下是可以安裝上的,親測有效。 配置 使用CtrlShiftP…

Spring Boot 約定大于配置:實現自定義配置

文章目錄 Spring Boot 約定大于配置:實現自定義配置引言1. Spring Boot 的約定大于配置2. 自定義配置的需求3. 實現自定義配置的步驟4. 示例:自定義 Spring MVC 配置4.1 創建自定義配置類4.2 創建自定義攔截器4.3 測試自定義配置 5. 其他自定義配置場景5…

交易系統優化方案

證券交易系統優化方案 一、選股策略體系 (一)擇時策略矩陣 尾盤集中篩選法(14:30后)聚焦量價異動個股,捕捉次日溢價機會早盤轉債套利法(9:25-10:00)通過可轉債與正股聯動性捕捉日內機會龍頭戰法(全時段)行業板塊強度排序,鎖定前三大市值龍頭容量資金戰法(中盤股適用…

在線Doc/Docx轉換為PDF格式 超快速轉換的一款辦公軟件 文檔快速轉換 在線轉換免費轉換辦公軟件

小白工具https://www.xiaobaitool.net/files/word-pdf/提供了一項非常實用的在線服務——將Doc或Docx格式的文檔快速轉換為PDF格式。這項服務不僅操作簡單,而且轉換效率高,非常適合需要頻繁處理文檔轉換的用戶。 服務特點: 批量轉換&#x…

java學習總結(四)MyBatis多表

一、多表結構 學生表、班級表、課程表、班級課程表 二、一對一 一個學生只屬于一個班級。 查詢:id name age gender banjiName SELECT s.id,s.name,s.age,s.gender,b.id AS banjiId,b.name AS banjiName FROM student AS s INNER JOIN banji AS b ON s.banji_id…

大語言模型學習及復習筆記(1)語言模型的發展歷程

1.大模型進入人們視野 ChatGPT 于2022年11月底上線 模型名稱 發布時間 核心突破 GPT-3 2020年6月 首款千億參數模型,少樣本學習 GPT-3.5-Turbo 2022年11月 對話能力優化,用戶級應用落地 GPT-4 2023年3月 多模態、強邏輯推理 GPT-4o / GPT-4…

【NLP】 3. Distributional Similarity in NLP(分布式相似性)

Distributional Similarity in NLP(分布式相似性) 分布式相似性(Distributional Similarity) 是自然語言處理(NLP)中的核心概念,基于“相似的單詞出現在相似的上下文中”這一假設。它用于衡量單…

【C#學習】協程等待

來源GPT,僅記錄學習 yield return WaitForEndOfFrame() 適用于 渲染結束后再執行代碼,但 WebGL 可能不適合這個操作,會拖慢幀率。(渲染得太慢) yield return null; 讓代碼在下一幀的 Update() 里繼續運行,更加流暢。 …