【问题标题】:python spark - filter rows in dataframe based in other dataframes line IN clause in SQLpython spark - 根据 SQL 中的其他数据帧行 IN 子句过滤数据帧中的行
【发布时间】:2017-07-24 19:23:58
【问题描述】:

我的主要数据框如下所示:

data = spark.createDataFrame([
      ("name1", "type1", 2), 
      ("name1", "type2", 1), 
      ("name1", "type3", 4), 
      ("name1", "type4", 5),
      ("name2", "type1", 6), 
      ("name2", "type2", 7), 
      ("name2", "type3", 8) \
    ],["name", "type", "cnt"])
    data.printSchema()

是什么:

|name  |type|cnt|
|------|-----------
|name1 |type1|  2|
|name1 |type2|  1|
|name1 |type3|  4|
|name1 |type4|  5|
|name2 |type1|  7|
|name2 |type2|  8|
| .... | ... |   |  

然后我想使用另外两个数据框来过滤主 DF:

df_name = spark.createDataFrame([
      ("name1"), 
    ],["name"])
    data.printSchema()


df_type = spark.createDataFrame([
      ("type1"),  
      ("type3")
    ],["type"])
    data.printSchema()

我想选择 df1 中所有在 df_name 中具有 name IN df_name 和 type 在 df_type 中的行。 类似于 SQL 中的 in 子句

SELECT * from df1
WHERE name in ('name1') 
AND type IN ('type1', 'type3');

2 行的结果应该是什么:

|name  |type|cnt|
|------|-----------
|name1 |type1|  2|
|name1 |type3|  4|

如何使用 spark 数据帧以有效的方式完成,性能是否比在 Hive 中更好?

谢谢

【问题讨论】:

    标签: python apache-spark select dataframe


    【解决方案1】:

    您可以将datatypename 数据框进行内部连接:

    data.join(df_type, ["type"], "inner").join(df_name, ["name"], "inner").show()
    
    +-----+-----+---+
    | name| type|cnt|
    +-----+-----+---+
    |name1|type3|  4|
    |name1|type1|  2|
    +-----+-----+---+
    

    【讨论】:

    • 太棒了,我怎样才能只保留正在合并的列之一?
    • 不完全确定您的意思,但通常您可以通过在加入前预先选择或重命名列来做到这一点,例如data.join(df_type.select("type"), ["type"], "inner").join(df_name.select("name"), ["name"], "inner")
    【解决方案2】:

    你可以这样做

    df1 = data.join(df_name, 
              data.name == df_name.name, 
              "inner").join(df_type, 
              data.type == df_name.type, 
              "inner")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-25
      • 2018-02-20
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      相关资源
      最近更新 更多