HIVE JDBC Conexión Usando Pyspark devuelve los nombres de columna como valores de fila
Estoy usando Pyspark para conectarse al VIHE y buscar algunos datos. El problema es que devuelve todas las filas con los valores que son nombres de columna. Está devolviendo nombres de columna correctos. Sólo los valores de Row son incorrectos.
Aquí está mi código
hive_jar_path="C:Users/shakir/Downloads/ClouderaHiveJDBC-2.6.11.1014/ClouderaHiveJDBC-2.6.11.1014/ClouderaHiveJDBC42-2.6.11.1014/HiveJDBC42.jar"
print(hive_jar_path)
print("")
import os
os.environ["HADOOP_HOME"]="c:/users/shakir/downloads/spark/spark/spark"
import os
os.environ["SPARK_HOME"]="c:/users/shakir/downloads/spark/spark/spark"
import findspark
findspark.init()
from pyspark import SparkContext, SparkConf, SQLContext
from pyspark.sql import SparkSession
import uuid
spark = SparkSession \
.builder \
.appName("Python Spark SQL Hive integration example") \
.config("spark.sql.warehouse.dir", "hdfs://...../user/hive/warehouse/..../....")
spark.config("spark.driver.extraClassPath", hive_jar_path)
spark.config("spark.sql.hive.llap", "true")
spark.config("spark.sql.warehouse.dir", "hdfs://...../user/hive/warehouse/..../....")
spark=spark.enableHiveSupport().getOrCreate()
import databricks.koalas as ks
print("Reading Data from Hive . . .")
options={
"fetchsize":1000,
"inferSchema": True,
"fileFormat":"orc",
"inputFormat":"org.apache.hadoop.hive.ql.io.orc.OrcInputFormat",
"outputFormat":"org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat",
"driver":"org.apache.hive.jdbc.HiveDriver",
}
df = ks.read_sql("SELECT * FROM PERSONS LIMIT 3", connection_string,options=options)
print("Done")
print(df)
Producto del código:
+------+-----+---------+
| Name | Age | Address |
+------+-----+---------+
| Name | Age | Address |
+------+-----+---------+
| Name | Age | Address |
+------+-----+---------+
| Name | Age | Address |
+------+-----+---------+
Pregunta hecha hace 3 años, 5 meses, 6 días - Por htmlhero
3 Respuestas:
-
mi situación no era la misma que la tuya, ya que me estaba conectando con
Spark
thrujdbc
sin embargo estaba obteniendo los mismos resultados que tú: nombres de columna devueltos como literales.Lo arreglé por anular el
JdbcDialect
. Esto respuesta tiene una buena explicación de por qué y algunos enlaces útiles también 1, 2.import org.apache.spark.sql.jdbc.JdbcDialect private case object HiveDialect extends JdbcDialect { override def canHandle(url : String): Boolean = url.startsWith("jdbc:hive2") override def quoteIdentifier(colName: String): String = { colName.split(‘.’).map(part => s”`$part`”).mkString(“.”) } } //Register dialect JdbcDialects.registerDialect(HiveDialect)
Sólo preste atención a los personajes que citan, el medio tiene esta extraña tipografía para citar caracteres.
Espero que ayude después de tanto tiempo. Dejarlo aquí para cuando me olvide de ello y google de nuevo :p
Respondida el Dec 17, 2020 a las 10:01 - por logicloom
Votos positivos: 0 | Votos negativos: 0 -
El problema que estás experimentando es debido a que estás utilizando el paquete
databricks.koalas
para trabajar con DataFrames en lugar de utilizar directamente Spark DataFrame.Koalas
es una librería que proporciona una API similar a Pandas para trabajar con Spark DataFrames, pero en esta ocasión está causando que los nombres de columna se conviertan en valores de fila.Para corregir esto, te recomiendo reemplazar la importación y uso de
databricks.koalas
con el uso directo de las funcionalidades de Spark DataFrame. Aquí tienes un ejemplo de cómo puedes adaptar tu código para lograrlo:python from pyspark.sql import SparkSession
Crear la sesión de Spark
spark = SparkSession.builder \ .appName("Python Spark SQL Hive integration example") \ .config("spark.sql.warehouse.dir", "hdfs://...../user/hive/warehouse/..../....") \ .config("spark.driver.extraClassPath", hive_jar_path) \ .config("spark.sql.hive.llap", "true") \ .enableHiveSupport() \ .getOrCreate()Leer los datos desde Hive
df = spark.sql("SELECT * FROM PERSONS LIMIT 3")Mostrar el DataFrame
df.show()Con esta modificación, el código utilizará directamente las funcionalidades de Spark DataFrame para conectarse a Hive y leer los datos, evitando así el problema de mostrar los nombres de columna como valores de fila.
Por favor, inténtalo de esta manera y verifica si ya obtienes los resultados esperados.
Respondida el Dec 18, 2020 a las 10:00 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
+---------+----------------+
Respondida el Dec 18, 2020 a las 10:07 - por Gemini
Votos positivos: 0 | Votos negativos: 0