Apache Spark 2.4 中解決複雜數據類型的內置函數和高階函數介紹

2021-03-02 過往記憶大數據

Apache Spark 2.4 是在11月08日正式發布的,其帶來了很多新的特性具體可以參見Apache Spark 2.4 正式發布,重要功能詳細介紹,本文主要介紹這次為複雜數據類型新引入的內置函數和高階函數。本次 Spark 發布共引入了29個新的內置函數來處理複雜類型(例如,數組類型),包括高階函數。

如果想及時了解Spark、Hadoop或者Hbase相關的文章,歡迎關注微信公共帳號:iteblog_hadoop

在 Spark 2.4 之前,為了直接操作複雜類型,有兩種典型的解決方案:

新的內置函數可以直接操作複雜類型,高階函數可以使用匿名 lambda 函數直接操作複雜值,類似於UDF,但具有更好的性能。

在本博客中,通過一些示例,我們將展示一些新的內置函數以及如何使用它們來處理複雜的數據類型。

典型處理方式

讓我們首先通過以下示例來回顧一下 Spark 2.4 之前的典型解決方案。

Option 1 – Explode and Collect

我們使用 explode 函數將數組拆分成多行,並計算 val + 1,最後再使用 collect_list 重構數組,如下所示:

SELECT id,
      collect_list(val + 1) AS vals
FROM   (SELECT id,
              explode(vals) AS val
       FROM iteblog) x
GROUP BY id

這種方式容易出錯並且效率低下,主要體現為三個方面。 首先,我們必須努力確保通過使用唯一鍵(unique key)來進行分組以便將新生成的數組完全組成為原始數組。其次,我們需要進行 group by 操作 ,這意味著需要進行一次 shuffle 操作; 但是 shuffle 操作並不保證重組後的數組和原始數組中數據的順序一致;最後,使用這種方式非常低效。

Option 2 – User Defined Function

接下來,我們選擇使用 Scala UDF,它可以接收 Seq[Int] 並對其中每個元素進行加 1 操作:

def addOne(values: Seq[Int]): Seq[Int] = {
 values.map(value => value + 1)
}
val plusOneInt = spark.udf.register("plusOneInt", addOne(_: Seq[Int]): Seq[Int])

或者,我們也可以使用 Python UDF,如下:

from pyspark.sql.types import IntegerType
from pyspark.sql.types import ArrayType
def add_one_to_els(elements):
return [el + 1 for el in elements]
spark.udf.register("plusOneIntPython", add_one_to_els, ArrayType(IntegerType()))

然後我們可以在 SQL 裡面如下使用:

SELECT id, plusOneInt(vals) as vals FROM iteblog

這種方式更加簡單快速,並且可以避免很多陷阱。但這種方式可能仍然效率低下,因為 Scala 或 Python 中的數據序列化可能很昂貴。

新的內置函數

下面我們來看看直接操作複雜類型的新內置函數。 這裡 列舉了每個函數的示例。 每個函數的名稱和參數標註了它們處理數據類型,T 或 U 表示數組;K,V 表示 map 類型。

高階函數(Higher-Order Functions)

為了進一步處理數組和 map 類型,我們使用了 SQL 中支持的匿名 lambda 函數或高階函數語法,使用 lambda 函數作為參數。lambda 函數的語法如下:

argument -> function body
(argument1, argument2, ...) -> function body

符號 -> 左邊表示參數列表,符號右邊定義函數體,在函數體中可以使用參數和其他變量來計算新的值。

使用匿名 Lambda 函數進行轉換

首先我們來看一下使用帶有匿名 lambda 函數的 transform 函數的例子。假設有一個表,包含三列數據:integer 類型的 key,integer 數組的 values,Integer 類型的二維數組 nested_values。如下:

keyvaluesnested_values1[1, 2, 3][[1, 2, 3], [], [4, 5]]

當我們執行下面 SQL 的時候:

SELECT TRANSFORM(values, element -> element + 1) FROM iteblog;

transform 函數通過執行lambda 函數遍歷數組種的每個元素並進行加一操作,然後創建一個新數組。
除了參數之外,我們還可以在 lambda 函數中使用其他變量,例如:key,這是表的另外一列:

SELECT TRANSFORM(values, element -> element + key) FROM iteblog;

如果你想要處理更複雜的嵌套類型,比如表中的 nested_values 列,你可以使用嵌套的 lambda 函數:

SELECT TRANSFORM(
   nested_values,
   arr -> TRANSFORM(arr,
     element -> element + key + SIZE(arr)))
FROM iteblog;

在內層的 lambda 函數中你可以使用 key 和 arr 這些在 lambda 函數上下文之外的變量以及表的其他欄位值。

總結

Spark 2.4 引入了 24 個新的內置函數,如 array_union,array_max ,array_min等,以及 5 個高階函數,如 transform, filter 等,這些函數都可以用於處理複雜類型。完整的列表可以參見這裡 。

本文原文:https://www.iteblog.com/archives/2457.html(點擊 下面 閱讀原文 即可進入),翻譯自:https://databricks.com/blog/2018/11/16/introducing-new-built-in-functions-and-higher-order-functions-for-complex-data-types-in-apache-spark.html?spm=a2c4e.11153940.blogcont672027.10.33b9731eaiP4B9

相關焦點

  • 類型內置函數-type() isinstance()
    Python中的類型內置函數那麼,我們如何判斷對象的數據類型呢?在Python中,有三個獲取數據類型的內置函數,分別是type()函數、 isinstance()函數、 issubclass()函數。今天我們介紹前兩種函數。
  • [翻譯]淺談JavaScript中的高階函數
    ,儘管它聽起來很複雜,但其實不是的。例如,Array.prototype.map,Array.prototype.filter和Array.prototype.reduce是語言中內置的一些高階函數。高階函數實戰讓我們來看一些語言中內置的高階函數,然後跟不使用高階函數的解決方案對比一下。1.
  • Spark入門必讀:核心概念介紹及常用RDD操作
    作者:肖冠宇如需轉載請聯繫大數據(ID:hzdashuju)01 Spark概述1. 核心概念介紹Spark架構示意圖如圖2-1所示,下面將分別介紹各核心組件。 DISK_ONLY_2 : org.apache.spark.storage.StorageLevel    val MEMORY_ONLY : org.apache.spark.storage.StorageLevel    val MEMORY_ONLY_2 : org.apache.spark.storage.StorageLevel    val MEMORY_ONLY_SER
  • spark結構化數據處理:Spark SQL、DataFrame和Dataset
    case class也可以嵌套或者包含複雜類型(如序列或者數組)。示例如下:val sqlContext = new org.apache.spark.sql.SQLContext(sc)import sqlContext.implicits.
  • Spark SQL重點知識總結
    和DataSet的數據抽象3、DataFrame就是RDD+Schema,可以認為是一張二維表格,劣勢在於編譯器不進行表格中的欄位的類型檢查,在運行期進行檢查4、DataSet是Spark最新的數據抽象,Spark的發展會逐步將DataSet作為主要的數據抽象,弱化RDD和DataFrame.DataSet包含了DataFrame所有的優化機制。
  • hive之窗口函數和自定義函數
    to_unix_timestamp('2020-08-08','yyyy-MM-dd');+---+|     _c0     |+---+| 1596844800  |+---+或者日期格式化函數date_format  這些 普通的函數,忘記的時候可以百度查一下api或者去spark sql文檔中去找一找,參照一下
  • 【譯】Using .NET for Apache Spark to Analyze Log Data
    在為Spark應用程式創建新的.NET時,我們只需要遵循以下幾個步驟,就可以開始從我們的數據中獲得這些有趣的見解:創建Spark會話讀取輸入數據,通常使用DataFrame操作和分析輸入數據,通常使用Spark SQL2.1 創建Spark會話    在任何Spark應用程式中,我們首先建立一個新的SparkSession
  • 經典用例,精彩教程之Spark MLlib - Apache Spark的機器學習庫
    在數據分析領域,機器學習是一種用於設計複雜模型和算法的方法,可以將它們用於商業用途被稱為預測分析的預測。機器學習任務有三類:監督學習:監督學習是輸入變量(x)和輸出變量(Y)的位置,您可以使用算法從輸入到輸出中學習映射函數。無監督學習:無監督學習是一種機器學習算法,用於從沒有標籤響應的輸入數據組成的數據集中提取推論。
  • Python不同數值類型間的轉化,以及內置數學函數示例
    上一集我們知道了Python數值的4個不同類型:整型、浮點型、複數型、布爾型。檢測一下小學數學還會多少,Python中4個數值類型你記住了嗎?這次我們繼續了解數值之間的數學函數以及相互的轉化方法。將數值轉化為整型在Python中,允許數值類型進行互相轉化,Python已經內置好了轉化函數。
  • 【必知】Hive內置函數
    今天和大家聊一下Hive的內置函數。Hive內置函數主要包括日期函數、字符串函數、數學函數、條件函數、UDTF函數等。因此,接下來,我們將依次介紹這些內置函數。1.(3.1415926);-- 向下取整,floorselect floor(3.1415926);4.
  • Spark 1.6.0 新手快速入門
    res3: Long = 15 更多RDD操作(More on RDD Operations) RDD的actions和transformations操作可以用於更加複雜的計算。示例中map和reduce操作的參數是Scala的函數式編程風格,Spark支持 Scala、Java、Python的編程風格,並支持Scala/Java庫。
  • Apache Spark大數據分析入門(一)
    關於全部摘要和提綱部分,請登錄我們的網站 http://www.mammatustech.com/apache-spark-course-quick-start-real-time-data-analytics進行訪問。
  • Hive(七) ----函數
    將一行中複雜的數據結構(map,array)拆分成多行。,可以用於行中複雜數據結果(array\map)Lateral view 與 explod連用,解決UDTF不能添加額外列問題。窗口函數又叫開窗函數,屬於分析函數一種,解決複雜報表統計需求的功能。用於計算基於組的某種聚合值,和聚合函數不同,對於每個組返回多行,聚合函數隻返回一行。窗口函數制定了分析函數工作的數據窗口大小,這個數據窗口大小可能會隨著行的變化而變化。
  • python高階函數:map、filter、reduce的替代品
    什麼是高階函數?高階函數是一種將函數作為參數,或者把函數作為結果返回的函數,map函數、sorted函數就是高階函數的典型例子。map函數在小編以前的文章中做過相應的知識分享。sorted函數是python的內置函數,它的可選參數key用於提供一個函數,它可以將函數應用到各個元素上進行排序。
  • 詭異 | Spark使用get_json_object函數
    2G \--driver-cores 2  \--num-executors 4 \--executor-cores 4 \--executor-memory 6G \.2.2 分析數據量發現其實並不大,也就幾十萬。以前上千萬的數據量都不需要這麼多內存。因此懷疑是get_json_object函數引起的問題。2.3 去掉get_json_object函數,果然任務非常流暢,而且內存調回6G依然是成功的。
  • 用Apache Spark進行大數據處理——第一部分:入門介紹
    它本身自帶了一個超過80個高階操作符集合。而且還可以用它在shell中以交互式地查詢數據。除了Map和Reduce操作之外,它還支持SQL查詢,流數據,機器學習和圖表數據處理。開發者可以在一個數據管道用例中單獨使用某一能力或者將這些能力結合在一起使用。
  • Python高階函數使用總結!
    本文結合各種實際的例子詳細講解了Python5個內建高階函數的使用,能夠幫助理解Python的數據結構和提高數據處理的效率,這5個函數分別是:一、map1.1 語法map函數的基本語法是map(func, seq),其含義指的是:對後面可迭代序列中的每個元素執行前面的函數func的功能,最終獲取到一個新的序列
  • 如何將 MapReduce 轉化為 Spark
    作者:周明耀 出處:developerWorks 中國MapReduce VS Spark目前的大數據處理可以分為以下三個類型:複雜的批量數據處理(batch data processing),通常的時間跨度在數十分鐘到數小時之間;基於歷史數據的交互式查詢(interactive query),通常的時間跨度在數十秒到數分鐘之間
  • 高階函數與函數式編程
    根據程式語言理論,一等對象必須滿足以下條件:Python 函數同時滿足這幾個條件,因而也被稱為 一等函數 。高階函數 則是指那些以函數為參數,或者將函數作為結果返回的函數。對高階函數稍加利用,便能玩出很多花樣來。本節從一些典型的案例入手,講解 Python 函數高級用法。
  • 大數據分析工程師面試集錦3-SQL/SparkSql/HiveQL
    (2)SQL簡單易學。它的語句全都是由有很強描述性的英語單詞組成,而且這些單詞的數目不多。(3)SQL雖然看上去很簡單,但實際上是一種強有力的語言,靈活使用其語言元素,可以進行非常複雜和高級的資料庫操作。題2:你是怎麼理解資料庫和表的?