【问题标题】:Merge multiple columns into one column in pyspark dataframe using python使用python将多列合并为pyspark数据框中的一列
【发布时间】:2017-11-21 11:00:36
【问题描述】:

我需要在 python 中使用 pyspark 将数据框的多列合并为一列,其中列表(或元组)作为列的值。

Input dataframe:

+-------+-------+-------+-------+-------+
| name  |mark1  |mark2  |mark3  | Grade |
+-------+-------+-------+-------+-------+
| Jim   | 20    | 30    | 40    |  "C"  |
+-------+-------+-------+-------+-------+
| Bill  | 30    | 35    | 45    |  "A"  |
+-------+-------+-------+-------+-------+
| Kim   | 25    | 36    | 42    |  "B"  |
+-------+-------+-------+-------+-------+

Output dataframe should be

+-------+-----------------+
| name  |marks            |
+-------+-----------------+
| Jim   | [20,30,40,"C"]  |
+-------+-----------------+
| Bill  | [30,35,45,"A"]  |
+-------+-----------------+
| Kim   | [25,36,42,"B"]  |
+-------+-----------------+

【问题讨论】:

    标签: python dataframe pyspark


    【解决方案1】:

    看看这个文档:https://spark.apache.org/docs/2.1.0/ml-features.html#vectorassembler

    from pyspark.ml.linalg import Vectors
    from pyspark.ml.feature import VectorAssembler
    
    assembler = VectorAssembler(
        inputCols=["mark1", "mark2", "mark3"],
        outputCol="marks")
    
    output = assembler.transform(dataset)
    output.select("name", "marks").show(truncate=False)
    

    【讨论】:

    • 我还有需要合并的字符串列。对于字符串列,它会给出以下错误消息 StringType is not supported: File "tester.py",line 34, in <module> output = assembler.transform(mydata_df) File"/usr/local/Cellar/apache-spark/2.1.0/libexec/python/pyspark/ml/base.py",line 105,in transform return self._transform(dataset) . . spark/2.1.0/libexec/python/pyspark/sql/utils.py", line 79, in deco raise IllegalArgumentException(s.split(': ', 1)[1], stackTrace) pyspark.sql.utils.IllegalArgumentException: u'Data type StringType is not supported.'
    • 向量汇编器只是合并数字类型,而不是字符串。在这种情况下,有一个字符串类型。
    【解决方案2】:

    如果这仍然相关,您可以使用StringIndexer 将您的字符串值编码为浮点替换。

    【讨论】:

      【解决方案3】:

      可以使用 sparks 数组功能合并列:

      import pyspark.sql.functions as f
      
      columns = [f.col("mark1"), ...] 
      
      output = input.withColumn("marks", f.array(columns)).select("name", "marks")
      

      您可能需要更改条目的类型才能使合并成功

      【讨论】:

        【解决方案4】:

        您可以在如下选择中执行此操作:

        from pyspark.sql.functions import *    
        df.select( 'name' ,
                concat( 
                    col("mark1"), lit(","), 
                    col("mark2"), lit(","), 
                    col("mark3"), lit(","),
                    col("Grade")
                ).alias('marks')  
            )
        

        如果需要[ ],可以添加点亮功能。

        from pyspark.sql.functions import *    
        df.select( 'name' ,
                concat(lit("["), 
                    col("mark1"), lit(","), 
                    col("mark2"), lit(","), 
                    col("mark3"), lit(","),
                    col("Grade"), lit("]")
                ).alias('marks')  
            )
        

        【讨论】:

          猜你喜欢
          • 2023-01-23
          • 2021-07-21
          • 2020-09-19
          • 2019-10-19
          • 1970-01-01
          • 2019-01-08
          • 2018-11-12
          • 2021-03-06
          相关资源
          最近更新 更多