如何使用Spark中ArrayType的节点路径列创建边列表?
How to create an edge list using a column of node path of ArrayType in Spark?
我有一个包含单列 ArrayType 的 Spark 数据集,它表示从一个用户通过他们共同的朋友到另一个用户的路径
path
["Amy","John","Wally"]
["Beth","Sally","Tim","Jacob"]
我最终想要实现的是 table 明确列出路径中的边。 (即边缘列表)
src
dest
"Amy"
"John"
"John"
"Amy"
"John"
"Wally"
"Beth"
"Sally"
"Sally"
"Tim"
"Tim"
"Sally"
"Tim"
"Jacob"
"Jacob"
"Tim"
我应该如何尝试将前者 table 转换为后者?
您可以通过在两个 slice
上使用 arrays_zip
将每个列表转换为边(对)列表 - 一个 w/o 最后一个元素和一个 w/o第一个元素。它将创建结构数组,然后 explode
结果数组将每个结构放在单独的行中,然后将结构列转换为两个单独的列 (withColumn
)。
然后你应该添加反向节点并使用 distinct
.
删除重复项
我假设您使用 DataFrame 并使用 spark sql 函数。
我有一个包含单列 ArrayType 的 Spark 数据集,它表示从一个用户通过他们共同的朋友到另一个用户的路径
path |
---|
["Amy","John","Wally"] |
["Beth","Sally","Tim","Jacob"] |
我最终想要实现的是 table 明确列出路径中的边。 (即边缘列表)
src | dest |
---|---|
"Amy" | "John" |
"John" | "Amy" |
"John" | "Wally" |
"Beth" | "Sally" |
"Sally" | "Tim" |
"Tim" | "Sally" |
"Tim" | "Jacob" |
"Jacob" | "Tim" |
我应该如何尝试将前者 table 转换为后者?
您可以通过在两个 slice
上使用 arrays_zip
将每个列表转换为边(对)列表 - 一个 w/o 最后一个元素和一个 w/o第一个元素。它将创建结构数组,然后 explode
结果数组将每个结构放在单独的行中,然后将结构列转换为两个单独的列 (withColumn
)。
然后你应该添加反向节点并使用 distinct
.
我假设您使用 DataFrame 并使用 spark sql 函数。