Apache spark pyspark:DataFrame.withColumn()有时需要使用不同的名称分配给新的DataFrame

Apache spark pyspark:DataFrame.withColumn()有时需要使用不同的名称分配给新的DataFrame,apache-spark,pyspark,apache-spark-sql,spark-dataframe,pyspark-sql,Apache Spark,Pyspark,Apache Spark Sql,Spark Dataframe,Pyspark Sql,当我将一个数值列乘以一个标量,将数据帧写回HDFS,然后在再次将其加载到数据帧时尝试查看该值时,这似乎特别发生。例如,pyspark外壳中不会发生这种情况 df=df.withColumn('AMOUNT',df.AMOUNT*lit(-1))=>不翻转列 df_new=df.withColumn('AMOUNT',df.AMOUNT*lit(-1))=>有效 当我使用其他方法或UDF时,它似乎没有表现出同样的奇怪。我可以将数据帧重新分配给它自己。即使我用不同的名称创建了一个全新的列,当我试图从

当我将一个数值列乘以一个标量,将数据帧写回HDFS,然后在再次将其加载到数据帧时尝试查看该值时,这似乎特别发生。例如,pyspark外壳中不会发生这种情况

df=df.withColumn('AMOUNT',df.AMOUNT*lit(-1))
=>不翻转列

df_new=df.withColumn('AMOUNT',df.AMOUNT*lit(-1))
=>有效

当我使用其他方法或UDF时,它似乎没有表现出同样的奇怪。我可以将数据帧重新分配给它自己。即使我用不同的名称创建了一个全新的列,当我试图从HDFS读回它时,它也不会显示在输出中

这是在纱线簇模式下spark-submit作业的一部分。PySpark 2.2.0


文档中是否有我无法挖掘的东西,或者我的实例中是否有特定的东西?

无法重现您的问题(Spark 2.2.0):

spark.version
#u'2.2.0'
将numpy作为np导入
从pyspark.ml.linalg导入向量
从pyspark.sql.functions导入
#一些数据
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,数组([2.09078012]))]
df=dd.map(λx:(x[0],Vectors.densite(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=带柱的测向(“1”,测向1*亮(-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]|
# +---+-------------+

添加显式列名并使用不同的Scala底层版本(2.11和2.10)对其进行测试不会改变行为。

这是在shell中吗?那里很好。我看到它时,它通过火花提交在纱线集群模式,写df到HDFS(拼花地板),然后加载它从HDFS单独回来后。@jastang它是在一个Databricks笔记本;如果是这样的话,你应该在文章中相应地强调它,并提供一个最小的可复制的例子——否则,你看不出任何人可以提供帮助