Comment filtre basé sur le tableau de la valeur dans PySpark?
Mon Schéma:
|-- Canonical_URL: string (nullable = true)
|-- Certifications: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- Certification_Authority: string (nullable = true)
| | |-- End: string (nullable = true)
| | |-- License: string (nullable = true)
| | |-- Start: string (nullable = true)
| | |-- Title: string (nullable = true)
|-- CompanyId: string (nullable = true)
|-- Country: string (nullable = true)
|-- vendorTags: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- score: double (nullable = true)
| | |-- vendor: string (nullable = true)
J'ai essayé la requête ci-dessous pour sélectionner des champs imbriqués de vendorTags
df3 = sqlContext.sql("select vendorTags.vendor from globalcontacts")
Comment puis-je interroger les champs imbriqués dans where
clause comme ci-dessous dans PySpark
df3 = sqlContext.sql("select vendorTags.vendor from globalcontacts where vendorTags.vendor = 'alpha'")
ou
df3 = sqlContext.sql("select vendorTags.vendor from globalcontacts where vendorTags.score > 123.123456")
quelque chose comme ça..
J'ai essayé ci-dessus les requêtes pour obtenir l'erreur ci-dessous
df3 = sqlContext.sql("select vendorTags.vendor from globalcontacts where vendorTags.vendor = 'alpha'")
16/03/15 13:16:02 INFO ParseDriver: Parsing command: select vendorTags.vendor from globalcontacts where vendorTags.vendor = 'alpha'
16/03/15 13:16:03 INFO ParseDriver: Parse Completed
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/spark/python/pyspark/sql/context.py", line 583, in sql
return DataFrame(self._ssql_ctx.sql(sqlQuery), self)
File "/usr/lib/spark/python/lib/py4j-0.9-src.zip/py4j/java_gateway.py", line 813, in __call__
File "/usr/lib/spark/python/pyspark/sql/utils.py", line 51, in deco
raise AnalysisException(s.split(': ', 1)[1], stackTrace)
pyspark.sql.utils.AnalysisException: u"cannot resolve '(vendorTags.vendor = cast(alpha as double))' due to data type mismatch: differing types in '(vendorTags.vendor = cast(alpha as double))' (array<string> and double).; line 1 pos 71"
OriginalL'auteur Suhas Chandramouli | 2016-03-15
Vous devez vous connecter pour publier un commentaire.
Pour l'égalité des requêtes, vous pouvez utiliser
array_contains
:Si vous souhaitez utiliser plus complexe prédicats vous devrez soit
explode
ou utiliser un UDF, par exemple quelque chose comme ceci:Spark 2.4. ou plus tard, il est également possible d'utiliser des fonctions d'ordre supérieur
OriginalL'auteur zero323