我在Hive中有一张大表(几十行,几亿行),我只想从中选择与正则表达式匹配的表。
目前,我有一个小例子可以首先尝试我的代码:
columns = ['id', 'column']
vals = [
(1, "VAL_ID1 BD store"),
(2, "VAL_ID2 BD store"),
(3, "VAL_ID3 BD model"),
(4, "BAD WRONG")
]
df = spark.createDataFrame(vals, columns)
然后我对正则表达式进行了测试,如下所示:
df_regex = df.withColumn('newColumn',F.regexp_extract(df['id'], '^(([a-zA-Z]{2}[a-zA-Z0-9]{1})+(_[a-zA-Z]{2}[a-zA-Z0-9]{1})*)(\s|$)',1))
正如我所说,这是一个测试数据帧。将来,我会在一张很大的桌子上“看”它。有什么方法可以仅添加与正则表达式匹配的行,从而创建更小的数据框?
现在,我正在读取每一行,然后添加一列withColumn
,该列的空白行与正则表达式不匹配。这样做是有道理的,但是如果可以避免的话,我认为不读取两次此数据帧是有好处的。
答案 0 :(得分:2)
您可能想使用where
。
df.where(
F.regexp_extract(df['id'], '^(([a-zA-Z]{2}[a-zA-Z0-9]{1})+(_[a-zA-Z]{2}[a-zA-Z0-9]{1})*)(\s|$)',1) != F.lit('')
)
实际上,我尝试了您的正则表达式,但没有结果。但是,只要您了解原理,我认为您可以使用该解决方案。
编辑:
如果可以避免的话,我认为不读取两次此数据帧有好处。
Spark仅在您执行“操作”时才会读取您的数据。转换是惰性的,因此仅在最后进行评估...因此无需担心Spark两次(或多次)读取数据。