[英]How can I use spark-sql to read and process a JSON event from kafka?
[英]How do I use "not rlike" in spark-sql?
rlike
工作正常但not rlike
拋出錯誤:
scala> sqlContext.sql("select * from T where columnB rlike '^[0-9]*$'").collect()
res42: Array[org.apache.spark.sql.Row] = Array([412,0], [0,25], [412,25], [0,25])
scala> sqlContext.sql("select * from T where columnB not rlike '^[0-9]*$'").collect()
java.lang.RuntimeException: [1.35] failure: ``in'' expected but `rlike' found
val df = sc.parallelize(Seq(
(412, 0),
(0, 25),
(412, 25),
(0, 25)
)).toDF("columnA", "columnB")
在 PySpark 中執行此操作的簡潔方法是:
df.filter(~df.column.rlike(pattern))
沒有什么不是 rlike,但在正則表達式中你有一個叫做負前瞻的東西,這意味着它會給出不匹配的詞。
對於上述查詢,您可以使用如下正則表達式。 可以說,您希望 ColumnB 不應該以數字“0”開頭
然后你可以這樣做。
sqlContext.sql("select * from T where columnB rlike '^(?!.*[1-9]).*$'").collect()
Result: Array[org.apache.spark.sql.Row] = Array([412,0])
我的意思是,你必須自己使用正則表達式來否定匹配,而不是 rlike。 Rlike 只是匹配您要求匹配的正則表達式。 如果您的正則表達式告訴它不匹配,則適用,如果您的正則表達式用於匹配,則它會執行此操作。
上面的答案建議使用負前瞻。 它可以在某些情況下實現。 然而,正則表達式並不是為了進行有效的否定匹配而設計的。 這些正則表達式容易出錯且難以閱讀。
Spark 從 2.0 版本開始支持“not rlike”。
# given 'url' is column on a dataframe
df.filter("""url not rlike "stackoverflow.com"""")
我唯一知道的用法是 sql 字符串表達式(如上所述)。 我在 python api 中找不到“不是”sql dsl 函數。 scala中可能有一個。
我知道你的問題有點老了,但以防萬一:你只是試過 scala 的一元 "?" 操作員?
在 Java 中你會這樣做:
DataFrame df = sqlContext.table("T");
DataFrame notLikeDf = df.filter(
df.col("columnB").rlike("^[0-9]*$").unary_$bang()
);
在 pyspark 中,我這樣做是:
df = load_your_df()
matching_regex = "yourRegexString"
matching_df = df.filter(df.fieldName.rlike(matching_regex))
non_matching_df = df.subtract(matching_df)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.