Buat vektor renggang kosong di PySpark

Saya memiliki kerangka data DF1 yang terlihat seperti ini:

+-------+------+
|user_id|meta  |
+-------+------+
|      1|  null|
|     11|  null|
|     15|  null|
+-------+------+

Skema:

root
 |-- user_id: string (nullable = true)
 |-- meta: string (nullable = true)

dan saya memiliki kerangka data DF2 lain yang terlihat seperti ini

+-------+------------------------------------+
|user_id|            Vectorz                 |
+-------+------------------------------------+
|     10|                       (2,[1],[1.0])|
|     12|                       (2,[1],[1.0])|
|     13|                       (2,[0],[1.0])|
|     14|                       (2,[1],[1.0])|
---------------------------------------------

Skema adalah:

[user_id: string, Vectorz: vector]

Saya ingin memasukkan semua user_ids dari DF1 ke DF2, tetapi membuat vektor renggang kosong untuk mereka karena kolom "meta" semuanya NULL.

Jadi, saya ingin DF2 akhirnya menjadi:

+-------+------------------------------------+
|user_id|            Vectorz                 |
+-------+------------------------------------+
|      1|                            (,[],[])|
|     10|                       (2,[1],[1.0])|
|     11|                            (,[],[])|
|     12|                       (2,[1],[1.0])|
|     13|                       (2,[0],[1.0])|
|     14|                       (2,[1],[1.0])|
|     15|                            (,[],[])|
---------------------------------------------

Adakah yang bisa membantu?

Saya baru mengenal PySpark. Jadi, maaf jika saya kurang mendapat informasi.


person VictorCreator    schedule 20.05.2020    source sumber
comment
Apa yang sudah kamu coba? Anda dapat mencoba menambahkan Vectorz ke DF1, membuang meta lalu menggabungkan kedua df tersebut.   -  person moon    schedule 20.05.2020
comment
Hai, Bisakah Anda memeriksa jawaban saya? silakan upvote + terima, jika itu berhasil untuk Anda   -  person Som    schedule 22.05.2020


Jawaban (1)


Anda dapat melanjutkan dan membuat vektor kosong untuk semua user_ids ketika meta adalah nol. Bagaimanapun Anda harus memutuskan kapan kolom meta bukan nol.

Kode sampel

  1. DF1
val spark = sqlContext.sparkSession
    val implicits = sqlContext.sparkSession.implicits
    import implicits._

    val df1 = sqlContext.range(1,4)
      .withColumnRenamed("id", "user_id")
      .withColumn("meta", lit(null).cast(DataTypes.StringType))
    df1.show(false)
    df1.printSchema()

      +-------+----+
      |user_id|meta|
      +-------+----+
      |1      |null|
      |2      |null|
      |3      |null|
      +-------+----+

    root
    |-- user_id: long (nullable = false)
    |-- meta: string (nullable = true)
  1. DF2
    import org.apache.spark.ml.linalg.Vectors
    val staticVector = udf(() => Vectors.sparse(5, Seq((1, 1.0), (3, 7.0))), SQLDataTypes.VectorType)
    val df2 = sqlContext.range(5,8)
      .withColumnRenamed("id", "user_id")
      .withColumn("Vectorz", staticVector())

    df2.show(false)
    df2.printSchema()

    +-------+-------------------+
    |user_id|Vectorz            |
    +-------+-------------------+
    |5      |(5,[1,3],[1.0,7.0])|
    |6      |(5,[1,3],[1.0,7.0])|
    |7      |(5,[1,3],[1.0,7.0])|
    +-------+-------------------+

    root
    |-- user_id: long (nullable = false)
    |-- Vectorz: vector (nullable = true)
  1. DF yang diproses
  val emptyVector = udf(() => Vectors.sparse(0, Array.empty[Int], Array.empty[Double]), SQLDataTypes.VectorType)

    val processedDF =
      // meta column shouldn't have any value
      // for the safer side adding filter as meta is null
      // need to decide what if meta is not null
      // I'm assigning empty vector to that also
      df1.where(col("meta").isNull)
        .withColumn("Vectorz", when(col("meta").isNull, emptyVector()).otherwise(emptyVector()))
        .drop("meta")
        .unionByName(df2)

    processedDF.show(false)
    processedDF.printSchema()

    +-------+-------------------+
    |user_id|Vectorz            |
    +-------+-------------------+
    |1      |(0,[],[])          |
    |2      |(0,[],[])          |
    |3      |(0,[],[])          |
    |5      |(5,[1,3],[1.0,7.0])|
    |6      |(5,[1,3],[1.0,7.0])|
    |7      |(5,[1,3],[1.0,7.0])|
    +-------+-------------------+

    root
    |-- user_id: long (nullable = false)
    |-- Vectorz: vector (nullable = true)


person Som    schedule 20.05.2020