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.
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!
É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
##############################################################