原始 Dataframe
| 标识符|电邮|姓名|
| - -|- -|- -|
| 一个|id1@first.com|约翰|
| 2个|id2@first.com|迈科|
| 2个|id2 @秒|迈科|
| 一个|id1@second.com|约翰|
我想转换成这个
| 标识符|电邮|电子邮件1|姓名|
| - -|- -|- -|- -|
| 一个|id1@first.com | id1@second.com|约翰|
| 2个|id2@first.com |id2 @秒|迈科|
这只是一个示例,我有非常大文件和超过60个列
即时消息使用
df = spark.read.option("header",True) \
.csv("contatcs.csv", sep =',')
但与pyspark合作。
import pyspark.pandas as ps
df = ps.read_csv('contacts.csv', sep=',')
df.head()
但我更喜欢spark.read,因为它是一个惰性评估,而PandasAPI不是
3条答案
按热度按时间bgibtngc1#
为了 在 Spark 中 做到 这 一 点 , 你 必须 有 一些 规则 来 确定 哪个 电子 邮件 是 第 一 个 , 哪个 是 第 二 个 。 当 你 使用 Spark 时 , CSV 文件 中 的 行 顺序 ( 没有 指定 行号 的 列 ) 是 一 个 不 好 的 规则 , 因为 每 一 行 都 可能 转到 不同 的 节点 , 这样 你 就 看不到 哪 一 行 是 第 一 个 还是 第 二 个 。
在 下面 的 示例 中 , 我 假设 规则 是 字母 顺序 , 所以 我 使用
collect_set
将 所有 电子 邮件 收集 到 一 个 数组 中 , 然后 使用array_sort
对 它们 进行 排序 。输入 :
中 的 每 一 个
脚本 :
格式
如果 你 有 一 个 行号 , 比如 ...
格式
您 可以 使用 以下 选项 :
第 一 个
ngynwnxp2#
如果您希望使其动态化,以便根据最大电子邮件计数创建新的电子邮件计数,您可以尝试以下逻辑和代码
解决方案
结果
dwbf0jvd3#
物理公园
我已经包括了一个极端的情况,当有奇数个电子邮件id。为此,找到最大长度,并迭代提取每个索引的电子邮件:
输出量:
"Pandas"
既然您在标签中提到了Pandas,那么以下是Pandas的解决方案:
输出量: