【发布时间】:2019-05-02 15:47:53
【问题描述】:
我有一个具有以下架构的数据框:
root
|-- urlA: string (nullable = true)
|-- urlB: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- distCol: double (nullable = true)
| | |-- url: string (nullable = true)
我想使用 UDF 访问结构中的元素,以便我可以对 distCol 值进行排序并获取 distCol 最小的 url(在 urlB 中)(实际上是前 N 个)
输入:
+--------------------+---------------------------------+
| urlA| urlB|
+--------------------+---------------------------------+
| some_url|[[0.02, url_0], [0.03, url_1],...|
+--------------------+---------------------------------+
输出(理想情况下):
+--------------------+------------------------------------+
| urlA| urlB|
+--------------------+------------------------------------+
| some_url|[[url_best_score_0, url_best_0],...]|
+--------------------+------------------------------------+
我的 udf:
def rank_url(row_url):
ranked_url = sorted(row_url[0], key=lambda x: x[0], reverse=False)[0:5]
return row_url
url_udf = udf(rank_url, ArrayType(StringType())
df = model.approxSimilarityJoin(pca_df, pca_df, 1.0).groupBy("datasetA.url").agg(collect_list(struct("distCol", "datasetB.url")).alias("urlB")).withColumn("urlB", url_udf("urlB"))
我想做类似的事情,但 row_url 并不能真正以这种方式访问。你有什么想法吗?
【问题讨论】:
标签: python dataframe pyspark user-defined-functions