我想要这个Pandas代码的等价物。下面的PANDA代码生成atable名称和在其中找到atable名称的索引:
import pandas as pd
df1 = pd.DataFrame({
'atable': ['Users', 'Users', 'Domains', 'Domains', 'Locks'],
'column': ['col_1', 'col_2', 'col_a', 'col_b', 'col'],
'column_type':['varchar', 'varchar', 'int', 'varchar', 'varchar'],
'is_null': ['No', 'No', 'Yes', 'No', 'Yes'],
})
df1_grouped = df1.groupby('atable')
# iterate over each group
for group_name, df_group in df1_grouped.groups.items():
print(group_name, df_group)
产出:
Domains Int64Index([2, 3], dtype='int64')
Locks Int64Index([4], dtype='int64')
Users Int64Index([0, 1], dtype='int64')
Spark输出应如下所示:
# +-------+--------------------+
# |atable | sources|
# +-------+--------------------+
# |Domains| [2, 3] |
# |Locks | [4] |
# | Users | [0, 1] |
# +-------+--------------------+
1条答案
按热度按时间nafvub8i1#
正如Samkart已经指出的那样,Spark Dataframe 中没有内在的顺序。如果您想保留原始 Dataframe 中的哪一行在分组操作中进入了哪个组的信息,可以使用monotonically_increasing_id为原始 Dataframe 中的每一行分配一个唯一的id,然后使用collect_list作为聚合函数:
产出:
monotonically_increasing_id
创建的ID是唯一的,但不是顺序的。创建顺序ID(here或here)有一些“黑客”方法,但通常这些方法不是一个好主意,因为唯一的顺序ID不适合Spark的分布式本质。