2016-07-15 17 views
1

Verwenden von Spark 1.6.1. Ich habe eine Reihe von Tabellen in einem MariaDb, die ich in pySpark DataFrame-Objekte konvertieren möchte. Aber createExternalTable() wirft. Zum Beispiel:PySpark createExternalTable() aus SQLContext

In [292]: tn = sql.tableNames()[10] 

In [293]: df = sql.createExternalTable(tn) 


/home/charles/spark-1.6.1/python/lib/py4j-0.9-src.zip/py4j/protocol.py in get_return_value(answer, gateway_client, target_id, name) 


306     raise Py4JJavaError(
307      "An error occurred while calling {0}{1}{2}.\n". 
--> 308      format(target_id, ".", name), value) 
309    else: 
310     raise Py4JError(

Py4JJavaError: An error occurred while calling o18.createExternalTable. 
: java.lang.RuntimeException: Tables created with SQLContext must be TEMPORARY. Use a HiveContext instead. 
at scala.sys.package$.error(package.scala:27) 
at org.apache.spark.sql.execution.SparkStrategies$DDLStrategy$.apply(SparkStrategies.scala:379) 
at org.apache.spark.sql.catalyst.planning.QueryPlanner$$anonfun$1.apply(QueryPlanner.scala:58) 
at org.apache.spark.sql.catalyst.planning.QueryPlanner$$anonfun$1.apply(QueryPlanner.scala:58) 
at scala.collection.Iterator$$anon$13.hasNext(Iterator.scala:371) 
at org.apache.spark.sql.catalyst.planning.QueryPlanner.plan(QueryPlanner.scala:59) 
at org.apache.spark.sql.execution.QueryExecution.sparkPlan$lzycompute(QueryExecution.scala:47) 
at org.apache.spark.sql.execution.QueryExecution.sparkPlan(QueryExecution.scala:45) 
at org.apache.spark.sql.execution.QueryExecution.executedPlan$lzycompute(QueryExecution.scala:52) 
at org.apache.spark.sql.execution.QueryExecution.executedPlan(QueryExecution.scala:52) 
at org.apache.spark.sql.execution.QueryExecution.toRdd$lzycompute(QueryExecution.scala:55) 
at org.apache.spark.sql.execution.QueryExecution.toRdd(QueryExecution.scala:55) 
at org.apache.spark.sql.SQLContext.createExternalTable(SQLContext.scala:695) 
at org.apache.spark.sql.SQLContext.createExternalTable(SQLContext.scala:668) 
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:381) 
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:209) 
at java.lang.Thread.run(Thread.java:745) 

Das gleiche passiert, wenn ich Quelle = 'jdbc' angeben.

Die Tabelle existiert:

In [297]: sql.sql("SELECT * from {} LIMIT 5".format(tn)).show() 
+--------------------+-----+-----+-----+----+------+------+------+----------------------+----+----+----+-----+ 
|    Date| Open| High| Low|Last|Change|Settle|Volume|Prev_Day_Open_Interest|prod|exch|year|month| 
+--------------------+-----+-----+-----+----+------+------+------+----------------------+----+----+----+-----+ 
|1999-10-29 00:00:...|245.0|245.0|245.0|null| null| 245.0| 1.0|     1.0| C| CME|2001| H| 
|1999-11-01 00:00:...|245.0|245.0|245.0|null| null| 245.0| 0.0|     1.0| C| CME|2001| H| 
|1999-11-02 00:00:...|245.0|245.0|245.0|null| null| 245.0| 0.0|     1.0| C| CME|2001| H| 
|1999-11-03 00:00:...|245.0|245.5|245.0|null| null| 245.5| 5.0|     6.0| C| CME|2001| H| 
|1999-11-04 00:00:...|245.5|245.5|245.5|null| null| 245.5| 0.0|     6.0| C| CME|2001| H| 
+--------------------+-----+-----+-----+----+------+------+------+----------------------+----+----+----+-----+ 

Nach dem Fehler, sollte dies für HIVE Daten arbeiten. Ich benutze keinen HIVEContext, sondern einen SQLContext. Gemäß https://spark.apache.org/docs/latest/api/python/pyspark.sql.html wird dies für ver> = 1.3 unterstützt.

Gibt es eine Möglichkeit, einen DataFrame aus einer SqlTable zu extrahieren?

+0

erklären konnte, was genau versuchen Sie zu erreichen? Es sieht so aus, als ob Sie bereits eine Tabelle mit diesem Namen registriert haben. Wo sind andere erforderliche Optionen? Die Art und Weise, wie Sie 'createExternalTable' verwenden, wäre nicht gültig, selbst wenn Sie keine Fehlermeldung sehen würden. – zero323

+0

Eine Bibliothek registrierte die Tabellen für mich. Nun, da sie registriert sind, möchte ich sie direkt als pySpark DataFrames bearbeiten. –

Antwort

1

eine Beschreibung gegeben, was Sie hier wollen, ist nicht createExternalTable die Hive-Tabellen aber einfache Tabelle zu verwalten verwendet wird:

df = sqlContext.table(tn) 

oder das Ergebnis der sql Anruf zuzuweisen:

df = sqlContext.sql("SELECT * from {}".format(tn)) 
+0

Yup - thx! Aus den Dokumenten ist nicht ersichtlich, dass createExternalTable() nur für Hive-Kontexte gilt. –

+0

Eigentlich von dem, was ich erinnere, ist es gleichbedeutend mit "CREATE EXTERNAL TABLE" in HIve, die ein Gegenteil sein würde, was Sie hier wollen. – zero323