фильтр pyspark со значением параметра не работает - PullRequest
1 голос
/ 11 февраля 2020

Ниже приведен код pyspark, который я пытался запустить. Я не могу заменить значение фильтром. Пожалуйста, порекомендуйте.

>>> coreWordFilter = "crawlResult.url.like('%"+IncoreWords[0]+"%')"
>>> coreWordFilter
"crawlResult.url.like('%furniture%')"
>>> preFilter = crawlResult.filter(coreWordFilter)
20/02/11 09:19:54 INFO execution.SparkSqlParser: Parsing command: crawlResult.url.like('%furniture%')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/apps/cloudera/parcels/SPARK2-2.2.0.cloudera2-1.cdh5.12.0.p0.232957/lib/spark2/python/pyspark/sql/dataframe.py", line 1078, in filter
    jdf = self._jdf.filter(condition)
  File "/apps/cloudera/parcels/SPARK2-2.2.0.cloudera2-1.cdh5.12.0.p0.232957/lib/spark2/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py", line 1133, in __call__
  File "/apps/cloudera/parcels/SPARK2-2.2.0.cloudera2-1.cdh5.12.0.p0.232957/lib/spark2/python/pyspark/sql/utils.py", line 73, in deco
    raise ParseException(s.split(': ', 1)[1], stackTrace)
pyspark.sql.utils.ParseException: u"\nUnsupported function name 'crawlResult.url.like'(line 1, pos 0)\n\n== SQL ==\ncrawlResult.url.like('%furniture%')\n^^^\n"

>>> preFilter = crawlResult.filter(crawlResult.url.like('%furniture%'))
>>>

Мне нужна помощь с тем, как добавить больше crawlResult.url.like logi c: код с сегодняшнего дня 2/12/2020:

>>> coreWordFilter = crawlResult.url.like('%{}%'.format(IncoreWords[0]))
>>> coreWordFilter
Column<url LIKE %furniture%>
>>> InmoreWords
['couch', 'couches']
>>> for a in InmoreWords:
    ...   coreWordFilter=coreWordFilter+" | crawlResult.url.like('%"+a+"%')"
>>> coreWordFilter
    Column<((((((url LIKE %furniture% +  | crawlResult.url.like('%) + couch) + %')) +  | crawlResult.url.like('%) + couches) + %'))>

preFilter = crawlResult. фильтр (coreWordFilter) не работает с вышеуказанным coreWordFilter. Я надеялся, что смогу сделать ниже, но не смог сделать - получил ошибку:

    >>> coreWordFilter2 = "crawlResult.url.like('%"+IncoreWords[0]+"%')"
    >>> coreWordFilter2
    "crawlResult.url.like('%furniture%')"
    >>> for a in InmoreWords:
    ...   coreWordFilter2=coreWordFilter2+" | crawlResult.url.like('%"+a+"%')"
    ...
    >>> coreWordFilter2
    "crawlResult.url.like('%furniture%') | crawlResult.url.like('%couch%') | 
    crawlResult.url.like('%couches%')"
    >>> preFilter = crawlResult.filter(coreWordFilter2)
    20/02/12 08:55:26 INFO execution.SparkSqlParser: Parsing command: 
    crawlResult.url.like('%furniture%') | crawlResult.url.like('%couch%') | 
    crawlResult.url.like('%couches%')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/apps/cloudera/parcels/SPARK2-2.2.0.cloudera2- 
    1.cdh5.12.0.p0.232957/lib/spark2/python/pyspark/sql/dataframe.py", line 
    1078, in filter
    jdf = self._jdf.filter(condition)
    File "/apps/cloudera/parcels/SPARK2-2.2.0.cloudera2- 
    1.cdh5.12.0.p0.232957/lib/spark2/python/lib/py4j-0.10.4- 
   src.zip/py4j/java_gateway.py", line 1133, in __call__
      File "/apps/cloudera/parcels/SPARK2-2.2.0.cloudera2-
   1.cdh5.12.0.p0.232957/lib/spark2/python/pyspark/sql/utils.py", line 73, in 
    deco
    raise ParseException(s.split(': ', 1)[1], stackTrace)
    pyspark.sql.utils.ParseException: u"\nUnsupported function name 
    'crawlResult.url.like'(line 1, pos 0)\n\n== SQL 
      ==\ncrawlResult.url.like('%furniture%') | 
    crawlResult.url.like('%couch%') | crawlResult.url.like('%couches%')\n^^^\n"

Я думаю, правильный синтаксис:

preFilter = crawlResult.filter(crawlResult.url.like('%furniture%') | crawlResult.url.like('%couch%'))

1 Ответ

0 голосов
/ 12 февраля 2020

Поскольку вы хотите условие динамического c or, я думаю, что фильтрация на основе оператора String (AND, OR, NOT и c) будет простой сравнить на Column логические операторы на основе (&, |, ~ et c).

Фиктивный фрейм данных и списки:

crawlResult.show()
+---+--------------+
| id|           url|
+---+--------------+
|  1|test-furniture|
|  1|         table|
|  1|     test-test|
|  1|         couch|
+---+--------------+

# IncoreWords
# ['furniture', 'office-table', 'counch', 'blah']

# InmoreWords
# ['couch', 'couches']

Теперь я просто следую вашей последовательности операций OP для построения динамического предложения c filter, но он даст вам широкая идея.

coreWordFilter2 = "url like ('%"+IncoreWords[0]+"%')"
# coreWordFilter2
#"url like ('%furniture%')"

for a in InmoreWords:
     coreWordFilter2=coreWordFilter2+" or url like('%"+a+"%')"

# coreWordFilter2
# "url like ('%furniture%') or url like('%couch%') or url like('%couches%')"

crawlResult.filter(coreWordFilter2).show()
+---+--------------+
| id|           url|
+---+--------------+
|  1|test-furniture|
|  1|         couch|
+---+--------------+

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...