Убедитесь, что определенный идентификатор присутствует в другом фрейме данных или нет - PullRequest
2 голосов
/ 26 июня 2019
val df1 = Seq(("[1,10,20]", "bat","43243"),("[20,4,10]","mouse","4324432"),("[30,20,3]", "horse","4324234")).toDF("id", "word","userid") 

val df2 = Seq((1, "raj", "name"),(2, "kiran","name"),(3,"karnataka","state"),(4, "Andrapradesh","state")).toDF("id", "name", "code")

Объяснение

У меня есть два кадра данных df1 & df2. df1 имеет столбец id со списком идентификаторов.

Мне нужно проверить, присутствует ли какой-либо из идентификаторов в кадре данных df2.

Условия

если id присутствует в столбце df2 id и если код state, тогда получите name конкретного id из df2 и создайте новый фрейм данных с name колонка

Ожидаемый результат

id        |     word    |  userid   | name

-------------------------+-----------------------

[30,20,3] |  "horse"    | "4324234" | "karnataka"  
[20,4,10] |  "mouse"    | "4324432" | "Andrapradesh"    

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Вы можете сначала сгладить столбец id, преобразовав его в массив и применив explode.Затем вы можете применить обычную операцию соединения между фреймами данных.

Например:

val df1 = Seq(("[1,10,20]", "bat","43243"),("[20,4,10]","mouse","4324432"),("[30,20,3]", "horse","4324234")).toDF("id", "word","userid") 
val df2 = Seq((1, "raj", "name"),(2, "kiran","name"),(3,"karnataka","state"),(4, "Andrapradesh","state")).toDF("id", "name", "code")

val flattenDf1 = df1.
  select(
    col("id"),
    expr("""split(regexp_replace(id, "\\[|\\]",""), ",")""").as("idArray"), col("word"),
    col("userid")).
  withColumn("id_", explode(col("idArray"))).
  drop("idArray")

df2.as("df2").
  join(
    flattenDf1.as("df1"),
    col("df2.id") === col("df1.id_")).
  filter("code = 'state'").
  select("df1.id", "word", "userid", "name").
  show
// Result: 
// +---------+-----+-------+------------+
// |       id| word| userid|        name|
// +---------+-----+-------+------------+
// |[30,20,3]|horse|4324234|   karnataka|
// |[20,4,10]|mouse|4324432|Andrapradesh|
// +---------+-----+-------+------------+

Надеюсь, это поможет.

0 голосов
/ 26 июня 2019

Вы можете просто использовать UDF в качестве условия в соединении:

val arrayJoin = udf { 
   (a: WrappedArray[Int], v: Int) => a.contains(v) 
}

val result = df1
      .join(df2.as("df2"), arrayJoin(df2("id"), df1("id"))) //join using udf
      .drop("df2.id", "df2.code") //drop unnecessary columns
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...