我有以下数据框
+--------------+---------------+
| SrcAddr| DstAddr|
+--------------+---------------+
| 192.168.100.5| 192.168.220.16|
| 192.168.100.5| 192.168.220.15|
|192.168.220.15| 192.168.100.5|
|192.168.220.16| 192.168.100.5|
| 192.168.100.5| 192.168.220.15|
|192.168.220.16| 192.168.100.5|
| 192.168.220.9| 192.168.100.5|
| 192.168.100.5| 192.168.220.9|
| 192.168.220.9| 192.168.100.5|
+--------------+---------------+
包含源地址和目标地址IP。 我想通过StringIndexer将它们转换为数字索引,但是我想学习列之间的通用映射。
不幸的是,StringIndexer在PySpark中没有提供如此丰富的界面。因此,我找到了一种解决方法,但是我想知道是否有更好的方法。
我所做的是:
首先,我计算两列之间的并集
src_addr_df = df.select(["SrcAddr"]).withColumnRenamed("SrcAddr", "Addr")
dst_addr_df = df.select(["DstAddr"]).withColumnRenamed("DstAddr", "Addr")
all_addr_df = src_addr_df.union(dst_addr_df)
然后,我在新创建的DataFrame上学习了一个通用的StringIndexer:
addrIndexer = StringIndexer(inputCol="Addr", outputCol="AddrIdx")
addrModel = addrIndexer.fit(all_addr_df)
最后,我使用学习的模型来转换原始数据框。这是棘手的部分,因为我需要经常重命名列以获得所需的结果:
df = addrModel.transform(df.withColumnRenamed("SrcAddr", "Addr")).withColumnRenamed("Addr", "SrcAddr").withColumnRenamed("AddrIdx", "SrcAddrIdx")
df = addrModel.transform(df.withColumnRenamed("DstAddr", "Addr")).withColumnRenamed("Addr", "DstAddr").withColumnRenamed("AddrIdx", "DstAddrIdx")
因此,我很想知道是否有可能更改StringIndexer的InputCol值,这将创建易于阅读的代码
最好的问候, 桑德罗