我正在使用monotonically_increasing_id()使用以下语法将行号分配给pyspark数据帧:
df1 = df1.withColumn("idx", monotonically_increasing_id())
现在df1有26,572,528条记录。因此,我期望idx值为0-26,572,527。
但是当我选择max(idx)时,它的值非常大:335,008,054,165。
这个功能是怎么回事?使用此功能与具有相似记录数量的另一个数据集合并是否可靠?
我有大约300个数据框,我想合并为一个数据框。因此,一个数据框包含ID,其他数据框包含与之对应的不同记录
从文档中
生成单调递增的64位整数的列。
保证生成的ID是单调递增且唯一的,但不是连续的。当前实现将分区ID放在高31位中,将记录号放在每个分区的低33位中。假设数据帧的分区少于10亿,每个分区的记录少于80亿。
因此,它不像RDB中的自动增量ID,并且对于合并 也不 可靠。
如果您需要像RDB中那样的自动递增行为,并且您的数据是可排序的,则可以使用 row_number
df.createOrReplaceTempView('df')
shtml" target="_blank">park.sql('select row_number() over (order by "some_column") as num, * from df')
+---+-----------+
|num|some_column|
+---+-----------+
| 1| ....... |
| 2| ....... |
| 3| ..........|
+---+-----------+
如果您的数据无法排序,并且您不介意使用rdds创建索引然后又退回到数据框,则可以使用 rdd.zipWithIndex()
可以在这里找到一个例子
简而言之:
# since you have a dataframe, use the rdd interface to create indexes with zipWithIndex()
df = df.rdd.zipWithIndex()
# return back to dataframe
df = df.toDF()
df.show()
# your data | indexes
+---------------------+---+
| _1 | _2|
+-----------=---------+---+
|[data col1,data col2]| 0|
|[data col1,data col2]| 1|
|[data col1,data col2]| 2|
+---------------------+---+
之后,您可能需要更多的转换才能使数据框达到所需的状态。注意:这不是一个非常有效的解决方案。
希望这可以帮助。祝好运!
编辑: 考虑一下,您可以结合monotonically_increasing_id
使用row_number
:
# create a monotonically increasing id
df = df.withColumn("idx", monotonically_increasing_id())
# then since the id is increasing but not consecutive, it means you can sort by it, so you can use the `row_number`
df.createOrReplaceTempView('df')
new_df = spark.sql('select row_number() over (order by "idx") as num, * from df')
虽然不确定性能。
有关执行此操作的方式和风险的完整示例,请参见此处
我正在尝试在PySpark中为两个数据框(df1和df2)创建自定义连接(类似于此),代码如下所示: 我得到的错误消息是: 有没有办法编写一个可以处理来自两个单独数据帧的列的 PySpark UDF?
问题内容: 我有以下代码: 我需要将所有复合行(例如2和4)拆分为多个行,同时保留“ id”,以得到如下结果: 问题答案: 就是这样:
问题内容: 我正在尝试过滤具有作为行值的PySpark数据框: 我可以使用字符串值正确过滤: 但这失败了: 但是每个类别上肯定都有价值。这是怎么回事? 问题答案: 您可以使用/ : 如果你想简单地丢弃值,您可以使用与参数: 基于等式的比较将无法正常工作,因为在SQL中未定义,因此任何将其与另一个值进行比较的尝试都将返回: 与值进行比较的唯一有效方法是/ ,它等效于/方法调用。
问题内容: 在不使用sql / hiveContext的Spark中使用groupby-having的语法是什么?我知道我能做 但是我该如何使用类似的语法 这似乎不存在。 问题答案: 是的,它不存在。您表达了相同的逻辑,后跟:
问题内容: 我想在中设置多列的(我有一个文件,我不得不手动将其解析为列表列表,因为该文件不适合) 我懂了 我可以设置它们的唯一方法是循环遍历每个列变量并使用重铸。 有没有更好的办法? 问题答案: 从0.17开始,您必须使用显式转换: (如下所述,在0.17中已不再使用“魔术”了) 您可以将它们应用于要转换的每一列: 并确认dtype已更新。 适用于大熊猫0.12-0.16的旧/建议答案:您可以用来
问题内容: 我有一个看起来像这样: 两列都是String类型(StringType()),我想将其放入spark ml randomForest中。为此,我需要将要素列转换为包含浮点数的向量。有谁知道怎么做吗? 问题答案: 如果您使用的是 Spark 2.x ,我相信这就是您所需要的: 使用 Spark 1.6 并没有太大不同: 具有可以帮助您实现所要完成的功能的功能。