-1

Cela semble se produire spécifiquement lorsque je multiplie une colonne numérique par un scalaire, réécrire le DataFrame sur HDFS, puis essayer de regarder la valeur lorsque je le charge à nouveau dans un DataFrame. Cela n'arrive pas dans le shell pyspark, par exemple.pyspark: DataFrame.withColumn() nécessite parfois une affectation à un nouveau DataFrame avec un nom différent

df = df.withColumn('AMOUNT', df.AMOUNT*lit(-1)) => ne bascule pas la colonne

df_new = df.withColumn('AMOUNT', df.AMOUNT*lit(-1)) => ça marche! Lorsque j'utilise d'autres méthodes ou des fonctions UDF, il ne semble pas avoir la même étrangeté. Je peux juste assigner le DataFrame à lui-même. Même si j'ai créé une nouvelle colonne avec un nom différent, elle n'apparaît pas dans la sortie lorsque j'essaie de la lire depuis HDFS.

Cela fait partie d'un travail soumis par étincelle en mode cluster. PySpark 2.2.0.

Y a-t-il quelque chose d'enfoui dans la documentation que je n'ai pas pu déterrer ou peut-être quelque chose de spécifique à mon instance?

Répondre

0

ne pouvez pas reproduire votre problème (Spark 2.2.0):

spark.version 
# u'2.2.0' 

import numpy as np 
from pyspark.ml.linalg import Vectors 
from pyspark.sql.functions import lit 

# some data 
dd = sc.parallelize([(2.0, np.array([ 2.09078012])), (2.0, np.array([ 2.09078012])), (2.0, np.array([ 2.09078012])), (1.0, np.array([ 2.09078012])), (2.0, np.array([ 2.09078012])), (1.0, np.array([ 2.09078012]))]) 
dd.take(1) 
# [(2.0, array([ 2.09078012]))] 

df = dd.map(lambda x: (x[0], Vectors.dense(x[1]))).toDF() 
df.show()  
# +---+------------+ 
# | _1|   _2| 
# +---+------------+ 
# |2.0|[2.09078012]| 
# |2.0|[2.09078012]| 
# |2.0|[2.09078012]| 
# |1.0|[2.09078012]| 
# |2.0|[2.09078012]| 
# |1.0|[2.09078012]| 
# +---+------------+ 

df = df.withColumn('_1', df._1*lit(-1)) 
df.show() 
# +----+------------+ 
# | _1|   _2| 
# +----+------------+ 
# |-2.0|[2.09078012]| 
# |-2.0|[2.09078012]| 
# |-2.0|[2.09078012]| 
# |-1.0|[2.09078012]| 
# |-2.0|[2.09078012]| 
# |-1.0|[2.09078012]| 
# +---+-------------+ 

Ajout des noms de colonnes explicites et tester différentes versions sous-jacentes de Scala (2,11 & 2.10) ne modifie pas le comportement.

+0

était-ce dans la coquille? c'est bon là-bas. Je le vois quand il passe par spark-submit en mode cluster, en écrivant le df sur HDFS (parquet), puis en le chargeant séparément depuis HDFS. – jastang

+0

@jastang Il est dans un cahier Databricks; Si oui, vous devriez le souligner en conséquence dans le poste, plus fournir un exemple * reproductible * minimal - sinon vous ne pouvez pas voir comment quelqu'un pourrait être utile – desertnaut