当我将数字列乘以标量,将数据帧写回HDFS,然后在再次将其加载到数据帧时尝试查看值时,这似乎特别发生。例如,在 pyspark shell 中不会发生。
df = df.withColumn('AMOUNT', df.AMOUNT*lit(-1))
=> 不会翻转列
df_new = df.withColumn('AMOUNT', df.AMOUNT*lit(-1))
=>有效!
当我使用其他方法或UDF时,它似乎没有表现出同样的怪异。我可以将数据帧重新分配给自身。即使我创建了一个具有不同名称的全新列,当我尝试从 HDFS 读回它时,它也不会显示在输出中。
这是在纱线簇模式下火花提交作业的一部分。PySpark 2.2.0.
文档中是否隐藏着我无法挖掘的内容,或者我的实例中可能存在特定内容?
无法重现您的问题 (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]|
# +---+-------------+
添加显式列名并使用不同的 Scala 底层版本(2.11 和 2.10)对其进行测试不会改变行为。