python - 结构数组上的 Pyspark 过滤器
问题描述
我有一个具有以下架构的 pyspark 数据框:
root
|-- channelGrouping: string (nullable = false)
|-- clientId: string (nullable = false)
|-- customDimensions: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- index: long (nullable = true)
| | |-- value: string (nullable = true)
我想获取 customDimensions 的索引“2”与正则表达式 r'b' 匹配的所有记录。
样本输入
+--------+---------------+--------------------------+
|clientId|channelGrouping| customDimensions |
+--------+---------------+--------------------------+
| 123 | alpha | [[1, a], [2, b] |
| 456 | beta | [[1, a], [2, b], [3, c] |
| 789 | gama | [[1, a], [2, a], [3, c] |
+--------+---------------+--------------------------+
预期输出:
+--------+---------------+--------------------------+
|clientId|channelGrouping| customDimensions |
+--------+---------------+--------------------------+
| 123 | alpha | [[1, a], [2, b] |
| 456 | beta | [[1, a], [2, b], [3, c] |
+--------+---------------+--------------------------+
在 bigquery 中,这可以使用以下查询来实现:
select * from
some_table
where REGEXP_CONTAINS((SELECT value FROM UNNEST(customDimensions) WHERE index=2), r'b')
解决方案
设法编写解决方案:
from pyspark.sql.functions import *
df = spark.read.json("some_path")
df1 = df.where(element_at(map_from_entries(col("customDimensions")), 2).rlike('b'))
推荐阅读
- java - 文件上传到没有 servlet 的 java 服务器
- python - 将图像写入与输入文件同名的文件夹中
- excel - 在动态数组公式中调用溢出范围
- reactjs - 反应在画布上更改鼠标光标/css
- javascript - 斜体在数据表的前 2 个字上
- javascript - javascript 的 window.scrollY 在某些设备上不起作用
- java - httpclient.client.HttpResponseException:请求太多
- c# - 抽象类构造函数和派生类
- ejb - 如果单个类可以由多个线程同时执行。为什么 EJB 将容器中的无状态 bean 池化?
- php - Safari Add to Homescreen 将分号添加到 url -> 404