栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

PySpark DataFrames-枚举而不转换为熊猫的方法?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PySpark DataFrames-枚举而不转换为熊猫的方法?

它不起作用,因为:

  1. 的第二个参数
    withColumn
    应该
    Column
    不是一个集合。
    np.array
    在这里不会工作
  2. 当您将
    "index in indexes"
    SQL表达式传递给时
    where
    indexes
    超出范围,并且不能将其解析为有效标识符

PySpark > = 1.4.0

您可以使用相应的窗口函数添加行号,并使用

Column.isin
方法或格式正确的查询字符串进行查询:

    from pyspark.sql.functions import col, rowNumber    from pyspark.sql.window import Window    w = Window.orderBy()    indexed = df.withColumn("index", rowNumber().over(w))    # Using DSL    indexed.where(col("index").isin(set(indexes)))    # Using SQL expression    indexed.where("index in ({0})".format(",".join(str(x) for x in indexes)))

看起来调用无

PARTITION BY
子句的窗口函数会将所有数据移动到单个分区,因此上述毕竟不是最佳解决方案。

有没有更快,更简单的处理方法?

并不是的。Spark Dataframes不支持随机行访问。

PairedRDD``lookup
如果使用进行分区,则可以使用相对较快的方法进行访问
HashPartitioner
。还有一个index-
rdd
项目,它支持有效的查找。

编辑

与PySpark版本无关,您可以尝试执行以下操作:

    from pyspark.sql import Row    from pyspark.sql.types import StructType, StructField, LongType    row = Row("char")    row_with_index = Row("char", "index")    df = sc.parallelize(row(chr(x)) for x in range(97, 112)).toDF()    df.show(5)    ## +----+    ## |char|    ## +----+    ## |   a|    ## |   b|    ## |   c|    ## |   d|    ## |   e|    ## +----+    ## only showing top 5 rows    # This part is not tested but should work and save some work later    schema  = StructType(        df.schema.fields[:] + [StructField("index", LongType(), False)])    indexed = (df.rdd # Extract rdd        .zipWithIndex() # Add index        .map(lambda ri: row_with_index(*list(ri[0]) + [ri[1]])) # Map to rows        .toDF(schema)) # It will work without schema but will be more expensive    # inSet in Spark < 1.3    indexed.where(col("index").isin(indexes))


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/596354.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号