2016-03-17 12 views
10

में मैं CDH5.5क्वेरी छत्ता तालिका pyspark

उपयोग कर रहा हूँ मैं छत्ता डिफ़ॉल्ट डेटाबेस और छत्ता आदेश से क्वेरी करने में सक्षम में निर्मित तालिका की है।

आउटपुट

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) 

हालांकि, मैं pyspark से तालिका क्वेरी करने के लिए के रूप में यह तालिका पहचान नहीं कर सकते में असमर्थ हूँ।

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** 

न्यू त्रुटि

>>> 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) 

धन्यवाद

उत्तर

20

हम संदर्भ एसक्यूएल विधि छत्ता है, क्योंकि यह हाइव तालिका नाम नहीं समझती सीधे हाइव तालिका नाम से पारित नहीं कर सकते हैं। एक तरीका यह pyspark खोल में हाइव तालिका को पढ़ने के लिए है:

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

छत्ता मेज पर एसक्यूएल चलाने के लिए: सबसे पहले, हम छत्ता तालिका पढ़ने से डेटा फ्रेम पर हम पाते हैं रजिस्टर करने के लिए की जरूरत है। फिर हम SQL क्वेरी चला सकते हैं।

bank.registerTempTable("bank_temp") 
hive_context.sql("select * from bank_temp").show() 
+0

धन्यवाद।हालांकि, मुझे यह त्रुटि मिल रही है। – Chn

+0

बैंक = hive_context.table ("बैंक") Traceback (सबसे हाल कॉल पिछले): फ़ाइल "", लाइन 1, फ़ाइल "/usr/lib/spark/python/pyspark/sql/context.py में ", लाइन 565, तालिका में वापसी डेटाफ्रेम (self._ssql_ctx.table (tableName), स्वयं) फ़ाइल" /usr/lib/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py ", लाइन 538, __call__ फ़ाइल" /usr/lib/spark/python/pyspark/sql/utils.py ", लाइन 36, डेको में वापसी f (* a, ** kw) फ़ाइल"/usr/lib/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/protocol.py ", लाइन 300, get_return_value py4j.protocol.Py4JJava त्रुटि: o30.table को कॉल करते समय एक त्रुटि हुई। – Chn

+0

मैंने डेटाबेस नाम शामिल करने के लिए उत्तर संपादित किया है। यह अब काम करना चाहिए। – bijay697

0

मैं भी ऐसा करने की कोशिश कर रहा हूं।

line 300, in get_return_value 

py4j.protocol.Py4JJavaError: जब मैं आदेशों का पहला सेट चलाने के लिए, मैं नीचे त्रुटि मिलती है, जबकि o28.table बुला एक त्रुटि हुई। : org.apache.spark.sql.types.DataTypeException: असमर्थित डेटा टाइप: char (1)। यदि आपके पास कोई संरचना है और इसका कोई फ़ील्ड नाम है तो कोई विशेष वर्ण है, कृपया बैकटिक्स () to quote that field name, e.g. x + y` का उपयोग करें। कृपया ध्यान दें कि बैकटिक खुद को फ़ील्ड नाम में समर्थित नहीं है।

-2

आप sqlCtx.sql का उपयोग कर सकते हैं। छत्ता-site.xml conf पथ चिंगारी को कॉपी किया जाना चाहिए।

my_dataframe = sqlCtx.sql ("श्रेणियों से * का चयन करें") my_dataframe.show()

7

SparkSQL अपनी ही metastore के साथ भेज दिया जाता है (डर्बी), ताकि यह सिस्टम पर हाइव स्थापित नहीं होने पर भी काम कर सके। यह डिफ़ॉल्ट मोड है।

उपरोक्त प्रश्न में, आपने हाइव में एक टेबल बनाई है। आपको table not found त्रुटि मिलती है क्योंकि स्पार्कएसक्यूएल अपने डिफ़ॉल्ट मेटास्टोर का उपयोग कर रहा है जिसमें आपके हाइव टेबल का मेटाडेटा नहीं है।

यदि आप स्पार्कएसक्यूएल को इसके बजाय हाइव मेटास्टोर का उपयोग करना चाहते हैं और हाइव टेबल एक्सेस करना चाहते हैं, तो आपको स्पार्क conf फ़ोल्डर में hive-site.xml जोड़ना होगा। सुनिश्चित करें कि

0

नहीं, अगर यह अभी तक हल नहीं होती है, मैं बाहर लिवी एकीकरण के साथ pyspark गिरी जाँच किया गया था और यह मैं कैसे छत्ता विन्यास

from pyspark.sql import Row 
from pyspark.sql import HiveContext 
sqlContext = HiveContext(sc) 
test_list = [('A', 25),('B', 20),('C', 25),('D', 18)] 
rdd = sc.parallelize(test_list) 
people = rdd.map(lambda x: Row(name=x[0], age=int(x[1]))) 
schemaPeople = sqlContext.createDataFrame(people) 
# Register it as a temp table 
sqlContext.registerDataFrameAsTable(schemaPeople, "test_table") 
sqlContext.sql("show tables").show() 


Output: 
-------- 
+--------+----------+-----------+ 
|database| tableName|isTemporary| 
+--------+----------+-----------+ 
|  |test_table|  true| 
+--------+----------+-----------+ 

Now one can query it in many different ways, 
1. jupyter kernel(sparkmagic syntax): 
    %%sql 
    SELECT * FROM test_table limit 4 
2. Using default HiveContext: 
    sqlContext.sql("Select * from test_table").show() 
0

परीक्षण किया मेरी समस्या पर, छत्ता साइट cp है। अपने $ SPARK_HOME/conf में xml, और cs mysql-connect-java - *। jar को अपने $ SPARK_HOME/jars में, इस समाधान ने मेरी समस्या हल की।