首页 文章

pyspark:DataFrame.withColumn()有时需要赋值给具有不同名称的新DataFrame

提问于
浏览
-1

这似乎特别发生在我将数字列乘以标量,将DataFrame写回HDFS,然后在我再次将其加载到DataFrame时尝试查看该值 . 例如,在pyspark shell中不会发生 .

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

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

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

这是一个以纱线集群模式提交工作的火花的一部分 . PySpark 2.2.0 .

文档中是否存在我无法挖掘的内容或者我的实例中可能存在的特定内容?

1 回答

  • 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)对其进行测试不会改变行为 .

相关问题