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, 4 meses, 28 días - Por htmlhero


3 Respuestas:

  • mi situación no era la misma que la tuya, ya que me estaba conectando con Sparkthru jdbc 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