在pyspark的数据框中引入一个新列,其值基于条件

q43xntqr  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(396)

我有如下的json数据。

{"images": [
    {
    "alt": null,
    "src": "link_1",
    },
    {
    "alt": null,
    "src": "link_2",
    },
    {
    "alt": "Apple",
    "src": "link_3",
    },
    {
    "alt": null,
    "src": "link_4",
    },
"images": [
    {
    "alt": "Orange",
    "src": "link_1",
    },
    {
    "alt": null,
    "src": "link_2",
    }
]}

我需要在一个Dataframe中引入一个新列,其值为src,条件如下。
切勿指定第一个位置值(示例:链接(1)
alt不应为null,然后将src的值赋给新列。如果有多个alt包含值,则会选择第一个alt值(位置1除外)。
如果所有的alt值都等于null,那么src的第二个位置值被分配给新列。
注意:图像总是包含多个元素。
对于上面的示例,预期的输出是

+--------------------+
|      new column    |
+--------------------+
|link_3              |
|link_2              |
+--------------------+

有人能帮忙得到预期的结果吗。提前谢谢。

4c8rllxm

4c8rllxm1#

我今天解决了这个问题。

def extractSecondaryImageUrl(self, *htmlValue):
    for element in htmlValue:
        if len(element) == 0:
            return ''
        if len(element) >= 2:
            element.pop(0)
            for x in element:
                if x['alt'] is not None:
                    return x['src']
            a = element.pop(0)
            return a['src']
        else:
            a = element.pop(0)
            return a['src']

    extractURL = udf(self.extractSecondaryImageUrl, StringType())

    productsDF = productsDF.select("*", extractURL("images").alias('new_column'))

相关问题