Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从Spark数据帧中选择空数组值_Python_Apache Spark_Apache Spark Sql_Pyspark_Pyspark Sql - Fatal编程技术网

Python 从Spark数据帧中选择空数组值

Python 从Spark数据帧中选择空数组值,python,apache-spark,apache-spark-sql,pyspark,pyspark-sql,Python,Apache Spark,Apache Spark Sql,Pyspark,Pyspark Sql,给定具有以下行的数据帧: 行=[ 行(col1='abc',col2=[8],col3=[18],col4=[16]), 行(col2='def',col2=[18],col3=[18],col4=[]), 行(col3='ghi',col2=[],col3=[],col4=[])] 我想为col2、col3和col4(即第三行)中的每一行删除具有空数组的行 例如,我可能希望此代码能够正常工作: df.where(~df.col2.isEmpty(),~df.col3.isEmpty(),~d

给定具有以下行的数据帧:

行=[
行(col1='abc',col2=[8],col3=[18],col4=[16]),
行(col2='def',col2=[18],col3=[18],col4=[]),
行(col3='ghi',col2=[],col3=[],col4=[])]
我想为
col2
col3
col4
(即第三行)中的每一行删除具有空数组的行

例如,我可能希望此代码能够正常工作:

df.where(~df.col2.isEmpty(),~df.col3.isEmpty(),~df.col4.isEmpty()).collect()
我有两个问题

  • 如何将where子句与
    组合,但更重要的是
  • 如何确定数组是否为空
  • 那么,是否有一个内置函数来查询空数组?是否有一种优雅的方法将空数组强制为
    na
    null

    我试图避免使用python来解决它,或者使用UDF或
    .map()

    如何将where子句与and组合

    要在列上构造布尔表达式,您应该使用
    &
    |
    ~
    运算符,因此在您的例子中应该是这样的

    ~lit(True) & ~lit(False)
    
    isEmpty = udf(lambda x: len(x) == 0, BooleanType())
    
    由于这些运算符的优先级高于复杂表达式的比较运算符,因此必须使用括号:

    (lit(1) > lit(2)) & (lit(3) > lit(4))
    
    如何确定数组是否为空

    我敢肯定,没有UDF就没有优雅的方式来处理这个问题。我想您已经知道可以像这样使用Python UDF了

    ~lit(True) & ~lit(False)
    
    isEmpty = udf(lambda x: len(x) == 0, BooleanType())
    
    也可以使用配置单元UDF:

    df.registerTempTable("df")
    query = "SELECT * FROM df WHERE {0}".format(
      " AND ".join("SIZE({0}) > 0".format(c) for c in ["col2", "col3", "col4"]))
    
    sqlContext.sql(query)
    
    想到的唯一可行的非UDF解决方案是转换到字符串

    cols = [
        col(c).cast(StringType()) != lit("ArrayBuffer()")
        for c in  ["col2", "col3", "col4"]
    ]
    cond = reduce(lambda x, y: x & y, cols)
    df.where(cond)
    
    但它的气味来自一英里之外

    使用
    count
    join
    也可以
    分解
    一个数组、
    groupBy
    agg
    ,但在任何实际场景中都很可能非常昂贵


    可能避免UDF和恶意攻击的最佳方法是用
    NULL

    有用的信息替换空数组,谢谢。我想看看用
    null
    替换空数组的例子。有没有一种非udf的方法可以实现这一点?我个人会使用Hive
    SIZE
    udf或加载时清理数据。