当前位置: 首页 > 知识库问答 >
问题:

PySpark Dataframes-不转换为熊猫的枚举方式?

谈旺
2023-03-14

我有一个非常大的pyspark.sql.dataframe.dataframe名为df。我需要一些枚举记录的方法--因此,能够访问具有特定索引的记录。(或选择具有索引范围的记录组)

在熊猫身上,我可以

indexes=[2,3,6,7] 
df[indexes]
indexes=np.arange(df.count())
df_indexed=df.withColumn('index', indexes)
    null

>

  • 为什么不起作用,如何使其起作用?如何向DataFrame添加行?
  • 以后制作类似:

     indexes=[2,3,6,7] 
     df1.where("index in indexes").collect()
    

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

  • 共有1个答案

    窦弘义
    2023-03-14

    它不起作用是因为:

    1. With Column的第二个参数应该是Column,而不是集合。NP.array在这里不起作用
    2. 当将“索引中的索引”作为SQL表达式传递给,其中indexs超出范围,且未将其解析为有效标识符

    PySpark>=1.4.0

    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)))
    

    独立于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))
    
     类似资料:
    • 问题内容: 我有一个很大的 pyspark.sql.dataframe.DataFrame 名为df。我需要某种枚举记录的方式- 因此,能够访问具有特定索引的记录。(或选择具有索引范围的记录组) 在大熊猫中,我可以 在这里我想要类似的东西 (并且不将数据框转换为熊猫) 我最接近的是: 通过以下方式枚举原始数据框中的所有对象: 问题: 为什么它不起作用以及如何使其起作用?如何在数据框中添加一行? 以

    • 今天,我尝试迁移到新的(谷歌)Firebase。 不仅API不同,数据库中存储数据的方式也不同。例如,旧Firebase最初以这种方式将数据写入数据库时,数据库中保存为“7.5”的数字(双精度)没有正确解析(标识为字符串)。必须手动重写双打(“7.5”到7.5)、布尔型(“true”到true)等数据库。 现在我遇到了一个新问题。尝试将枚举写入数据库时出错: 致命异常:主进程:com.aayaff

    • 问题内容: 我已经读过一个对Pandas的SQL查询,并且值以dtype’object’的形式出现,尽管它们是字符串,日期和整数。我能够将日期“ object”转换为Pandas datetime dtype,但是在尝试转换字符串和整数时遇到错误。 这是一个例子: 将转换为日期时间可以: 但是尝试将转换为整数时出现错误: 注意:我尝试时遇到类似的错误 当尝试转换为字符串时,似乎什么也没有发生。 问

    • 我有一个字段在熊猫DataFrame被导入为字符串格式。它应该是日期时间变量。如何将其转换为日期时间列,然后根据日期进行筛选。 示例: 数据帧名称:原始数据

    • 问题内容: 给定以下枚举,将Int强制转换为Java中的枚举的正确方法是什么? 问题答案: 尝试在必须为or的地方,即该枚举的有效序数。 请注意,在Java中,枚举实际上是类(因此,枚举值是对象),因此您不能将an 甚至转换为枚举。

    • 我有枚举类,我想向列表视图显示枚举数据。谁能说出如何做到这一点?