Spark Streaming - 访问 Spark SQL 数据帧中的自定义案例 class 对象数组
Spark Streaming - Accessing an array of custom case class objects in a Spark SQL dataframe
在我的 Spark Streaming 查询中,我想使用一个名为 URL 的案例 class,其中包含 3 个字符串成员,如下所示:
url: string
domain: string
topLevelDomain: string
我想创建一个 DataFrame
,其中一个成员是 URL 个对象的数组。架构如下:
root
|-- AccountId: integer (nullable = true)
|-- url1: struct (nullable = true)
| |-- url: string (nullable = true)
| |-- domain: string (nullable = true)
| |-- topLevelDomain: string (nullable = true)
|-- finalURLs: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- url: string (nullable = true)
| | |-- domain: string (nullable = true)
| | |-- topLevelDomain: string (nullable = true)
列 finalURLs
是 URL 个对象的数组。
稍后,我想对此列应用转换,将其转换为字符串列表,根据其他列中的值,字符串列表可以是 domain
或 topLevelDomain
。
首先,是否可以有一列是 case class 对象的数组?如果是,如何应用上述转换将其缩减为字符串数组?
如果要使用case-类,需要将DataFrame转成数据集。如果这样做,则需要转换整个记录,而不仅仅是 URL。这样的事情会起作用:
case class URL(url:String, domain:String, topLevelDomain:String)
case class MyRow(AccountId:Int, url1:URL, finalURLs:Seq[URL])
df.as[MyRow].map{case MyRow(accountId,url1,finalURLs) => (accountId,url1,finalURLs.map{case URL(url,domain,topLevelDomain) => /*your logic here*/ })}
在我的 Spark Streaming 查询中,我想使用一个名为 URL 的案例 class,其中包含 3 个字符串成员,如下所示:
url: string
domain: string
topLevelDomain: string
我想创建一个 DataFrame
,其中一个成员是 URL 个对象的数组。架构如下:
root
|-- AccountId: integer (nullable = true)
|-- url1: struct (nullable = true)
| |-- url: string (nullable = true)
| |-- domain: string (nullable = true)
| |-- topLevelDomain: string (nullable = true)
|-- finalURLs: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- url: string (nullable = true)
| | |-- domain: string (nullable = true)
| | |-- topLevelDomain: string (nullable = true)
列 finalURLs
是 URL 个对象的数组。
稍后,我想对此列应用转换,将其转换为字符串列表,根据其他列中的值,字符串列表可以是 domain
或 topLevelDomain
。
首先,是否可以有一列是 case class 对象的数组?如果是,如何应用上述转换将其缩减为字符串数组?
如果要使用case-类,需要将DataFrame转成数据集。如果这样做,则需要转换整个记录,而不仅仅是 URL。这样的事情会起作用:
case class URL(url:String, domain:String, topLevelDomain:String)
case class MyRow(AccountId:Int, url1:URL, finalURLs:Seq[URL])
df.as[MyRow].map{case MyRow(accountId,url1,finalURLs) => (accountId,url1,finalURLs.map{case URL(url,domain,topLevelDomain) => /*your logic here*/ })}