代码之家  ›  专栏  ›  技术社区  ›  Masterbuilder

如何从键值映射、spark数据帧中提取值

  •  0
  • Masterbuilder  · 技术社区  · 6 年前

    我有一个带有map的列,其中键和值发生了变化。我试图提取该值并创建一个新列。 输入

    ---------------+
    |symbols        |
    +---------------+
    |[3pea -> 3PEA] |
    |[barello -> BA]|
    |[]             |
    |[]             |
    +---------------+
    

    ---------------+
    |symbols        |
    +---------------+
    |3PEA         |
    |BA           |
    |             |
    |            |
    +---------------+
    

    以下是我迄今为止使用UDF所做的尝试

    def map_value=udf((inputMap:Map[String,String])=> {inputMap.map(x=>x._2) 
          }) 
    

    但这是给我的

    java.lang.UnsupportedOperationException: Schema for type scala.collection.immutable.Iterable[String] is not supported
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Ged    6 年前
    import org.apache.spark.sql.functions._
    import spark.implicits._
    val m = Seq(Array("A -> abc"), Array("B -> 0.11856755943424617"), Array("C -> kqcams"))
    
    val df = m.toDF("map_data")
    df.show
    // Simulate your data I think.
    
    val df2 = df.withColumn("xxx", split(concat_ws("",$"map_data"), "-> ")).select($"xxx".getItem(1).as("map_val")).drop("xxx")
    df2.show(false)
    

    结果:

    +--------------------+
    |            map_data|
    +--------------------+
    |          [A -> abc]|
    |[B -> 0.118567559...|
    |       [C -> kqcams]|
    +--------------------+
    
    +-------------------+
    |map_val            |
    +-------------------+
    |abc                |
    |0.11856755943424617|
    |kqcams             |
    +-------------------+
    
        2
  •  0
  •   Clay    4 年前

    scala v2.3 api , sql v2.3 api pyspark v2.4 api map_values

    在pyspark中,scala将非常类似。
    spark ):

    from pyspark.sql import functions as F
    
    df = (
        spark.read.json(sc.parallelize(["""[
            {"key": ["3pea"],    "value": ["3PEA"] },
            {"key": ["barello"], "value": ["BA"]   }
        ]"""]))
        .select(F.map_from_arrays(F.col("key"), F.col("value")).alias("symbols") )
    )
    
    df.printSchema()
    df.show()
    
    root
     |-- symbols: map (nullable = true)
     |    |-- key: string
     |    |-- value: string (valueContainsNull = true)
    
    +---------------+
    |        symbols|
    +---------------+
    | [3pea -> 3PEA]|
    |[barello -> BA]|
    +---------------+
    
    df.select((F.map_values(F.col("symbols"))[0]).alias("map_vals")).show()
    
    +--------+
    |map_vals|
    +--------+
    |    3PEA|
    |      BA|
    +--------+