web-dev-qa-db-fra.com

AnalysisException: u "ne peut pas résoudre les colonnes d'entrée données par" nom ": [liste] dans sqlContext dans spark

J'ai essayé un exemple simple comme:

data = sqlContext.read.format("csv").option("header", "true").option("inferSchema", "true").load("/databricks-datasets/samples/population-vs-price/data_geo.csv")

data.cache() # Cache data for faster reuse
data = data.dropna() # drop rows with missing values
data = data.select("2014 Population estimate", "2015 median sales price").map(lambda r: LabeledPoint(r[1], [r[0]])).toDF()

Cela fonctionne bien, mais quand j'essaie quelque chose de très similaire comme:

data = sqlContext.read.format("csv").option("header", "true").option("inferSchema", "true").load('/mnt/%s/OnlineNewsTrainingAndValidation.csv' % MOUNT_NAME)

data.cache() # Cache data for faster reuse
data = data.dropna() # drop rows with missing values
data = data.select("timedelta", "shares").map(lambda r: LabeledPoint(r[1], [r[0]])).toDF()
display(data)

Il déclenche une erreur: AnalysisException: u "ne peut pas résoudre les colonnes d'entrée données" timedelta ": [data_channel_is_tech, ...

hors cours j'ai importé LabeledPoint et LinearRegression

Qu'est-ce qui ne va pas?

Même le cas le plus simple

df_cleaned = df_cleaned.select("shares")

déclenche la même AnalysisException (erreur).

* veuillez noter: df_cleaned.printSchema () fonctionne bien.

11
Elm662

J'ai trouvé le problème: certains des noms de colonnes contiennent des espaces blancs avant le nom lui-même. Donc

data = data.select(" timedelta", " shares").map(lambda r: LabeledPoint(r[1], [r[0]])).toDF()

travaillé. Je pourrais attraper les espaces blancs en utilisant

assert " " not in ''.join(df.columns)  

Maintenant, je pense à un moyen de supprimer les espaces blancs. Toute idée est très appréciée!

4
Elm662

Étant donné que l'en-tête contient des espaces ou des tabulations, supprimez les espaces ou les tabulations et essayez

1) Mon exemple de script

from pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.config("spark.some.config.option", "some-value") \
.getOrCreate()

df=spark.read.csv(r'test.csv',header=True,sep='^')
print("#################################################################")
print df.printSchema()
df.createOrReplaceTempView("test")
re=spark.sql("select max_seq from test")
print(re.show())
print("################################################################")

2) Le fichier d'entrée, ici 'max_seq' contient de l'espace donc nous obtenons une exception ci-dessous

Trx_ID^max_seq ^Trx_Type^Trx_Record_Type^Trx_Date

Traceback (most recent call last):
  File "D:/spark-2.1.0-bin-hadoop2.7/bin/test.py", line 14, in <module>
    re=spark.sql("select max_seq from test")
  File "D:\spark-2.1.0-bin-hadoop2.7\python\lib\pyspark.Zip\pyspark\sql\session.py", line 541, in sql
  File "D:\spark-2.1.0-bin-hadoop2.7\python\lib\py4j-0.10.4-src.Zip\py4j\Java_gateway.py", line 1133, in __call__
  File "D:\spark-2.1.0-bin-hadoop2.7\python\lib\pyspark.Zip\pyspark\sql\utils.py", line 69, in deco
pyspark.sql.utils.AnalysisException: u"cannot resolve '`max_seq`' given input columns: [Venue_City_Name, Trx_Type, Trx_Booking_Status_Committed, Payment_Reference1, Trx_Date, max_seq , Event_ItemVariable_Name, Amount_CurrentPrice, cinema_screen_count, Payment_IsMyPayment, r

2) Supprimer l'espace après la colonne "max_seq", cela fonctionnera bien

Trx_ID^max_seq^Trx_Type^Trx_Record_Type^Trx_Date


17/03/20 12:16:25 INFO DAGScheduler: Job 3 finished: showString at <unknown>:0, took 0.047602 s
17/03/20 12:16:25 INFO CodeGenerator: Code generated in 8.494073 ms
  max_seq
    10
    23
    22
    22
only showing top 20 rows

None
##############################################################
3
y durga prasad