web-dev-qa-db-fra.com

Interrogez la table Hive dans pyspark

J'utilise CDH5.5

J'ai une table créée dans la base de données par défaut Hive et capable de l'interroger à partir de la commande Hive.

Sortie

Hive> use default;

OK

Time taken: 0.582 seconds


Hive> show tables;

OK

bank
Time taken: 0.341 seconds, Fetched: 1 row(s)

Hive> select count(*) from bank;

OK

542

Time taken: 64.961 seconds, Fetched: 1 row(s)

Cependant, je ne peux pas interroger la table à partir de pyspark, car il ne peut pas reconnaître la table.

from pyspark.context import SparkContext

from pyspark.sql import HiveContext

sqlContext = HiveContext(sc)


sqlContext.sql("use default")

DataFrame[result: string]

sqlContext.sql("show tables").show()

+---------+-----------+

|tableName|isTemporary|

+---------+-----------+

+---------+-----------+


sqlContext.sql("FROM bank SELECT count(*)")

16/03/16 20:12:13 INFO parse.ParseDriver: Parsing command: FROM bank SELECT count(*)
16/03/16 20:12:13 INFO parse.ParseDriver: Parse Completed
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "/usr/lib/spark/python/pyspark/sql/context.py", line 552, in sql
      return DataFrame(self._ssql_ctx.sql(sqlQuery), self)
    File "/usr/lib/spark/python/lib/py4j-0.8.2.1-src.Zip/py4j/Java_gateway.py",   line 538, in __call__
    File "/usr/lib/spark/python/pyspark/sql/utils.py", line 40, in deco
      raise AnalysisException(s.split(': ', 1)[1])
  **pyspark.sql.utils.AnalysisException: no such table bank; line 1 pos 5**

Nouvelle erreur

>>> from pyspark.sql import HiveContext
>>> Hive_context = HiveContext(sc)
>>> bank = Hive_context.table("default.bank")
16/03/22 18:33:30 INFO DataNucleus.Persistence: Property datanucleus.cache.level2 unknown - will be ignored
16/03/22 18:33:30 INFO DataNucleus.Persistence: Property Hive.metastore.integral.jdo.pushdown unknown - will be ignored
16/03/22 18:33:44 INFO DataNucleus.Datastore: The class "org.Apache.hadoop.Hive.metastore.model.MFieldSchema" is tagged as "embedded-only" so does not have its own datastore table.
16/03/22 18:33:44 INFO DataNucleus.Datastore: The class "org.Apache.hadoop.Hive.metastore.model.MOrder" is tagged as "embedded-only" so does not have its own datastore table.
16/03/22 18:33:48 INFO DataNucleus.Datastore: The class "org.Apache.hadoop.Hive.metastore.model.MFieldSchema" is tagged as "embedded-only" so does not have its own datastore table.
16/03/22 18:33:48 INFO DataNucleus.Datastore: The class "org.Apache.hadoop.Hive.metastore.model.MOrder" is tagged as "embedded-only" so does not have its own datastore table.
16/03/22 18:33:50 INFO DataNucleus.Datastore: The class "org.Apache.hadoop.Hive.metastore.model.MResourceUri" is tagged as "embedded-only" so does not have its own datastore table.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/spark/python/pyspark/sql/context.py", line 565, in table
    return DataFrame(self._ssql_ctx.table(tableName), self)
  File "/usr/lib/spark/python/lib/py4j-0.8.2.1-src.Zip/py4j/Java_gateway.py", line 538, in __call__
  File "/usr/lib/spark/python/pyspark/sql/utils.py", line 36, in deco
    return f(*a, **kw)
  File "/usr/lib/spark/python/lib/py4j-0.8.2.1-src.Zip/py4j/protocol.py", line 300, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o22.table.
: org.Apache.spark.sql.catalyst.analysis.NoSuchTableException
    at org.Apache.spark.sql.Hive.client.ClientInterface$$anonfun$getTable$1.apply(ClientInterface.scala:123)
    at org.Apache.spark.sql.Hive.client.ClientInterface$$anonfun$getTable$1.apply(ClientInterface.scala:123)
    at scala.Option.getOrElse(Option.scala:120)
    at org.Apache.spark.sql.Hive.client.ClientInterface$class.getTable(ClientInterface.scala:123)
    at org.Apache.spark.sql.Hive.client.ClientWrapper.getTable(ClientWrapper.scala:60)
    at org.Apache.spark.sql.Hive.HiveMetastoreCatalog.lookupRelation(HiveMetastoreCatalog.scala:406)
    at org.Apache.spark.sql.Hive.HiveContext$$anon$1.org$Apache$spark$sql$catalyst$analysis$OverrideCatalog$$super$lookupRelation(HiveContext.scala:422)
    at org.Apache.spark.sql.catalyst.analysis.OverrideCatalog$$anonfun$lookupRelation$3.apply(Catalog.scala:203)
    at org.Apache.spark.sql.catalyst.analysis.OverrideCatalog$$anonfun$lookupRelation$3.apply(Catalog.scala:203)
    at scala.Option.getOrElse(Option.scala:120)
    at org.Apache.spark.sql.catalyst.analysis.OverrideCatalog$class.lookupRelation(Catalog.scala:203)
    at org.Apache.spark.sql.Hive.HiveContext$$anon$1.lookupRelation(HiveContext.scala:422)
    at org.Apache.spark.sql.SQLContext.table(SQLContext.scala:739)
    at org.Apache.spark.sql.SQLContext.table(SQLContext.scala:735)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:606)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.Java:231)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.Java:379)
    at py4j.Gateway.invoke(Gateway.Java:259)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.Java:133)
    at py4j.commands.CallCommand.execute(CallCommand.Java:79)
    at py4j.GatewayConnection.run(GatewayConnection.Java:207)
    at Java.lang.Thread.run(Thread.Java:745)

merci

19
Chn

Nous ne pouvons pas transmettre le nom de la table Hive directement à la méthode SQL de contexte Hive car elle ne comprend pas le nom de la table Hive. Une façon de lire la table Hive dans pyspark Shell est la suivante:

from pyspark.sql import HiveContext
Hive_context = HiveContext(sc)
bank = Hive_context.table("default.bank")
bank.show()

Pour exécuter le code SQL sur la table Hive: Nous devons d’abord enregistrer le cadre de données obtenu en lisant la table Hive . Nous pouvons ensuite exécuter la requête SQL.

bank.registerTempTable("bank_temp")
Hive_context.sql("select * from bank_temp").show()
34
bijay697

SparkSQL est livré avec son propre métastore (derby), de sorte qu'il puisse fonctionner même si Hive n'est pas installé sur le système. Il s'agit du mode par défaut.

Dans la question ci-dessus, vous avez créé une table dans Hive. Vous obtenez l'erreur table not found car SparkSQL utilise son métastore par défaut qui ne contient pas de métadonnées de votre table Hive.

Si vous souhaitez que SparkSQL utilise à la place le métastore Hive et accède aux tables Hive, vous devez ajouter Hive-site.xml dans le dossier spark conf.

9
sujit

À mon problème, cp le Hive-site.xml à votre $ SPARK_HOME/conf et cp le mysql-connect-Java - *. Jar à votre $ SPARK_HOME/jars, cette solution a résolu mon problème.

0
Huang