2017-10-13 15 views
0

j'ai une application qui permet de se connecter à MySQL, et je Hibernate config pour elle comme ceci:Dialecte Hibernate pour Hive/SparkSQL?

<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.url">jdbc:mysql://somehost:3306/some_db</property> 
     ... 

Maintenant, si je veux me connecter à Hive/SparkSQL à la place, ce serait les valeurs équivalentes pour ces propriétés être?

J'ai quelques idées sur driver_class et url (en supposant que nous utilisons le port 10000), mais ce devrait être le dialect?

<property name="hibernate.connection.driver_class">org.apache.hive.jdbc.HiveDriver</property> 
<property name="hibernate.connection.url">jdbc:hive2://someHost:10000</property> 

Mise à jour

J'ai essayé beaucoup de valeurs différentes, mais aucun d'entre eux travaillent. (Je n'ai pas encore pour savoir ce que MetaStore l'installation Hive Apache utilise, alors voici que je ne faisais que d'essais et d'erreurs)

org.hibernate.dialect.MySQLDialect 
org.hibernate.dialect.MySQLInnoDBDialect 
org.hibernate.dialect.DerbyDialect 
org.hibernate.dialect.DerbyTenFiveDialect 
org.hibernate.dialect.Oracle10gDialect 
org.hibernate.dialect.H2Dialect 
org.hibernate.dialect.Dialect 

je remarquai que dans tous les cas, il y a un avertissement de Mise en veille prolongée qui disait:

WARN JdbcServicesImpl,main:160 - \ 
    HHH000341: Could not obtain connection metadata : \ 
    Method not supported 

Et puis le code irait dans un NullPointerException
dans org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure() (ligne 207 4.2.0.Final). J'ai téléchargé le code source d'Hibernate et tracé la logique. L'exception a été dû au fait que quelques lignes avant une variable dialect (de type Dialect) a été déterminée à null en raison de une exception prise lors d'une tentative d'exécuter la ligne 138:

metaReportsDDLCausesTxnCommit = meta.dataDefinitionCausesTransactionCommit(); 

L'exception était

java.sql.SQLException: Method not supported 

(qui a causé le message d'avertissement ci-dessus)

Est-ce que cela signifie que je ne peux pas utiliser Hibernate avec Apache Hive? Si c'est le cas, alors qu'il en soit ainsi. (Je suppose que je devrais pour échanger la mise en œuvre Hibernate pour cette partie) Mais je suis curieux de connaître la réponse faisant autorité à ce sujet.

Sur Internet, je n'ai pas pu trouver de preuves solides que personnes utilisaient Hibernate avec Apache Hive.

+1

Si vous ne vous souciez que du métastore Hive (comme SparkSQL), vous pouvez utiliser le dialecte Mysql, Oracle10, Derby ou Postgres en fonction de ce que votre métastore utilise –

+0

@ cricket_007 - Merci! Comment puis-je savoir ce que le métastore utilise? (Désolé si cela semble trop ignorant - Ce lac de données est mis en place par quelqu'un d'autre.) Y at-il une commande que je peux exécuter? Ou un fichier que je peux rechercher? – leeyuiwah

+1

Habituellement, j'essayerais de trouver le fichier hive-site.xml et une propriété contenant 'jdo'. Je ne suggère pas que c'est ce dont vous avez besoin, simplement que SparkSQL n'utilise pas JDBC pour parler à HiveServer2 –

Répondre

-1

Je réponds à ma propre question ici.

Je pense que la réponse est "Non - il n'y a pas de dialecte pour Hive/SparkSQL" pour Hibernate. Apparemment, il n'y a pas de support pour HiveServer2 (c'est-à-dire pas le Metastore Hive) dans Hibernate. Je crois que c'est vrai (confiance de 95%) dès maintenant (2017-10-19). Dans mon cas, j'ai fini par réécrire mon code et remplacer le code Hibernate pour diriger le code JDBC à la place.J'ai été chanceux que le code Hibernate était juste pour la simple requête DB (session.createSQLQuery()) et non ORM, donc le changement était relativement facile.