日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

学习笔记Spark(七)—— Spark SQL应用(2)—— Spark DataFrame基础操作

發(fā)布時(shí)間:2025/3/21 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习笔记Spark(七)—— Spark SQL应用(2)—— Spark DataFrame基础操作 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

二、Spark DataFrame基礎(chǔ)操作

2.1、DataFrame

  • DataFrame是一種不可變的分布式數(shù)據(jù)集,這種數(shù)據(jù)集被組織成指定的列,類似于關(guān)系數(shù)據(jù)庫中的表。
  • 數(shù)據(jù)集的每一列都帶有名稱和類型,對(duì)于數(shù)據(jù)的內(nèi)部結(jié)構(gòu)又很強(qiáng)的描述性。
  • RDD是分布式的Java對(duì)象的集合DataFrame是分布式的Row對(duì)象的集合


2.1.1、DataFrame特點(diǎn)

  • 支持KB級(jí)到PB級(jí)得到數(shù)據(jù)處理
  • 支持多種數(shù)據(jù)格式和存儲(chǔ)系統(tǒng)
  • 通過Spark SQL Catalyst優(yōu)化器可以進(jìn)行高效的代碼生成與優(yōu)化
  • 能夠無縫集成Spark上的大數(shù)據(jù)處理工具
  • 提供了Python、Java、Scala、R等多種語言API

2.2、創(chuàng)建DataFrame

  • 從結(jié)構(gòu)化數(shù)據(jù)文件創(chuàng)建DataFrame
  • 從外部數(shù)據(jù)庫創(chuàng)建DataFrame
  • 從RDD創(chuàng)建DataFrame
  • 從Hive中的表創(chuàng)建DataFrame

2.2.1、從結(jié)構(gòu)化數(shù)據(jù)文件創(chuàng)建DataFrame

  • 初始化一個(gè)SparkSession,名稱為spark
  • spark.read.parquet(path: String):讀取一個(gè)Parquet文件,返回一個(gè)DataFrame
  • spark.read.json(path: String):讀取一個(gè)JSON文件,返回一個(gè)DataFrame
  • spark.read.csv(path: String):讀取CSV文件,返回一個(gè)DataFrame
  • spark.read.text(path: String):讀取文本文件的數(shù)據(jù),返回一個(gè)DataFrame,只有一個(gè)value字段
  • 查看DataFrame

    • printSchema:查看數(shù)據(jù)模式,打印出列的名稱和類型
    • show:查看數(shù)據(jù)
      show():顯示前20條記錄
      show(numRows:Int):顯示numRows條
      show(truncate:Boolean):是否最多只顯示20個(gè)字符,默認(rèn)為true
      show(numRows:Int,truncate:Boolean):顯示numRows條記錄并設(shè)置過長字符串的顯示格式
    • first/head/take/takeAsList:獲取若干行數(shù)據(jù)
    • collect/collectAsList:獲取所有數(shù)據(jù)

    示例:讀取parquet文件創(chuàng)建DataFrame
    1、從parquet讀取數(shù)據(jù):

    val df_parquet = spark.read.parquet("/user/root/sparksql_data/users.parquet")

    2、從json讀取數(shù)據(jù):

    val df_json = spark.read.json("/user/root/sparksql_data/people.json")

    3、從csv讀取數(shù)據(jù):

    val df_csv = spark.read.option("header", "true").option("sep", ";").csv("/user/root/sparksql_data/people.csv")

    2.2.2、從外部數(shù)據(jù)庫創(chuàng)建DataFrame

  • Spark SQL可以從外部數(shù)據(jù)庫(比如MySQL、Oracle等數(shù)據(jù)庫)中創(chuàng)建DataFrame
  • 使用這種方式創(chuàng)建DataFrame需要通過JDBC連接或ODBC連接的方式訪問數(shù)據(jù)庫
  • spark.read.jdbc(url: String, table: String, properties: Properties)
  • 示例:讀取mysql數(shù)據(jù)庫test的student表


    2.2.3、從RDD創(chuàng)建DataFrame-方法1

  • 利用反射機(jī)制推斷RDD模式,使用這種方式首先需要定義一個(gè)case class,因?yàn)橹挥衏ase class才能被Spark隱式地轉(zhuǎn)換為DataFrame。
    示例

  • 2.2.4、從RDD創(chuàng)建DataFrame-方法2

  • 從原始RDD創(chuàng)建一個(gè)元素為Row類型的RDD
  • 用StructType創(chuàng)建一個(gè)和RDD中Row的結(jié)構(gòu)相匹配的Schema
  • 通過SparkSession提供的createDataFrame方法將Schema應(yīng)用到RDD上
    示例:讀取people.txt創(chuàng)建DataFrame

  • 2.2.5、從Hive中的表創(chuàng)建DataFrame

  • 通過SQL查詢語句
  • spark.read.table(tablename)
    示例:


  • 任務(wù)1:讀取Hive中的學(xué)生成績表bigdata和math,查看學(xué)生信息

  • 創(chuàng)建Hive表bigdata和math

  • 導(dǎo)入數(shù)據(jù)到表中

  • 讀取Hive表bigdata和math創(chuàng)建DataFrame

  • 查看DataFrame


  • 2.3、DataFrame常用API

    示例:


    2.3.1、自定義udf-用于SQL查詢

    • import org.apache.spark.sql.functions._
    • import org.apache.spark.sql.types._
    • udf(f: AnyRef, dataType: DataType)
      示例:

    2.3.2、自定義udf-用于DataFrame API

    • org.apache.spark.sql.functions._
    • import org.apache.spark.sql.types._
    • udf(f: AnyRef, dataType: DataType)
      示例

    任務(wù)2:統(tǒng)計(jì)每個(gè)學(xué)生的平均成績和總分

  • 關(guān)聯(lián)bigdata和math
  • 根據(jù)學(xué)生ID分組統(tǒng)計(jì)成績平均分和總分
  • 并根據(jù)總分進(jìn)行降序排序

  • 2.4、保存DataFrame

    • 1、保存成文本文件

    • 2、保存到外部數(shù)據(jù)庫

    • 3、保存為Hive表

    • write方法可以將DataFrame保存成文件,write操作有一個(gè)可選參數(shù)SaveMode,用這個(gè)參數(shù)可以指定如何處理數(shù)據(jù)已經(jīng)存在的情況。

      參數(shù)SaveMode:
      Overwrite代表覆蓋目錄下之前存在的數(shù)據(jù)
      Append代表給指導(dǎo)目錄下追加數(shù)據(jù)
      Ignore代表如果目錄下已經(jīng)有文件,那就什么都不執(zhí)行
      ErrorIfExists代表如果保存目錄下存在文件就報(bào)錯(cuò)


    2.4.1、保存為文本文件

    • df.write.mode("overwrite").parquet(path: String)

    • df.write.mode("overwrite"). json(path: String)

    • df.write.mode("overwrite").option("header", "true").option("sep", ";"). csv(path: String)

    • df.write.mode("overwrite").text(path: String) //只能有一個(gè)字段


    2.4.2、保存到外部數(shù)據(jù)庫

    • jdbc(url: String, table: String, connectionProperties: Properties)

      mysql查看:

    2.4.3、保存到Hive

    • df.write.mode("overwrite"). saveAsTable(tableName: String)

      hive查看(先進(jìn)入train數(shù)據(jù)庫,然后再查看):

    任務(wù)3:將每個(gè)學(xué)生各科成績、總分、平均分都保存到Hive中

    • 合并學(xué)生的各科成績、總分、平均分
    • 保存DataFrame到Hive

      hive查看(先進(jìn)入train數(shù)據(jù)庫,然后再查看):

      結(jié)果:

    總結(jié)

    以上是生活随笔為你收集整理的学习笔记Spark(七)—— Spark SQL应用(2)—— Spark DataFrame基础操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。