创建仅选择符合条件的行的数据框

时间:2019-01-22 13:20:29

标签: python regex dataframe pyspark

我在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,该列的空白行与正则表达式不匹配。这样做是有道理的,但是如果可以避免的话,我认为不读取两次此数据帧是有好处的。

1 个答案:

答案 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两次(或多次)读取数据。