Tratando de colocar una columna en un DataFrame, pero tengo los nombres de columna con puntos en ellos, que se me escapó.

Antes de que se me escape, mi esquema se parece a esto:

root
 |-- user_id: long (nullable = true)
 |-- hourOfWeek: string (nullable = true)
 |-- observed: string (nullable = true)
 |-- raw.hourOfDay: long (nullable = true)
 |-- raw.minOfDay: long (nullable = true)
 |-- raw.dayOfWeek: long (nullable = true)
 |-- raw.sensor2: long (nullable = true)

Si trato de quitar una columna, me sale:

df = df.drop("hourOfWeek")
org.apache.spark.sql.AnalysisException: cannot resolve 'raw.hourOfDay' given input columns raw.dayOfWeek, raw.sensor2, observed, raw.hourOfDay, hourOfWeek, raw.minOfDay, user_id;
        at org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42)
        at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:60)
        at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:57)
        at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:319)
        at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:319)
        at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:53)

Nota que ni siquiera estoy tratando de colocar en las columnas con puntos en el nombre.
Ya que yo no podía hacer mucho sin escapar de los nombres de columna, me convertí en el esquema a:

root
 |-- user_id: long (nullable = true)
 |-- hourOfWeek: string (nullable = true)
 |-- observed: string (nullable = true)
 |-- `raw.hourOfDay`: long (nullable = true)
 |-- `raw.minOfDay`: long (nullable = true)
 |-- `raw.dayOfWeek`: long (nullable = true)
 |-- `raw.sensor2`: long (nullable = true)

pero que no parece ayudar. Me sigue apareciendo el mismo error.

Traté de escapar de todos los nombres de columna, y dejar de usar el nombre con escape, pero esto no funciona bien.

root
 |-- `user_id`: long (nullable = true)
 |-- `hourOfWeek`: string (nullable = true)
 |-- `observed`: string (nullable = true)
 |-- `raw.hourOfDay`: long (nullable = true)
 |-- `raw.minOfDay`: long (nullable = true)
 |-- `raw.dayOfWeek`: long (nullable = true)
 |-- `raw.sensor2`: long (nullable = true)

df.drop("`hourOfWeek`")
org.apache.spark.sql.AnalysisException: cannot resolve 'user_id' given input columns `user_id`, `raw.dayOfWeek`, `observed`, `raw.minOfDay`, `raw.hourOfDay`, `raw.sensor2`, `hourOfWeek`;
        at org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42)
        at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:60)

Hay otra manera para quitar una columna que no podría fallar en este tipo de datos?

OriginalEl autor MrE | 2016-03-14

2 Comentarios

  1. 21

    Bien, parece que he encontrado la solución, después de todo:

    df.drop(df.col("raw.hourOfWeek")) parece funcionar

    Respuesta útil. Pero tengo otra pregunta similar. Supongamos que tengo alrededor de 100 columnas, en una Chispa Dataframe. Hay alguna forma de seleccionar sólo algunas columnas de esta dataframe y crear otro dataframe con las columnas seleccionadas ? algo así como df2 = df1.seleccione(df.col(“col1”, “col2”))
    creo que esta stackoverflow.com/questions/36131716/… contesta a tu pregunta

    OriginalEl autor MrE

  2. 3
    val data = df.drop("Customers");

    funcionará bien para el normal columnas

    val new = df.drop(df.col("old.column"));
    el punto fue para columnas con un punto en el nombre.
    Gracias por señalar @MrE

    OriginalEl autor sai chaithanya

Dejar respuesta

Please enter your comment!
Please enter your name here