Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 使用字典创建一个函数,将列从字符串更改为整数_Apache Spark_User Defined Functions - Fatal编程技术网

Apache spark 使用字典创建一个函数,将列从字符串更改为整数

Apache spark 使用字典创建一个函数,将列从字符串更改为整数,apache-spark,user-defined-functions,Apache Spark,User Defined Functions,我完全是个新手。我有一个RDD,它的列包含{'Fair','Good','Better','Best'}字符串,我想创建一个函数,使用字典将这些字符串更改为{1,2,3,4}。这是我到目前为止所做的,但它不起作用,它返回字符串对象时没有items属性。我使用的是RDD,而不是熊猫数据帧。我需要的功能,能够使用自定义项来更改原始数据帧。该功能之后将显示 spark.udf.register(,) 这项工作: def rank(n): if n == "Fair":

我完全是个新手。我有一个RDD,它的列包含{'Fair','Good','Better','Best'}字符串,我想创建一个函数,使用字典将这些字符串更改为{1,2,3,4}。这是我到目前为止所做的,但它不起作用,它返回字符串对象时没有items属性。我使用的是RDD,而不是熊猫数据帧。我需要的功能,能够使用自定义项来更改原始数据帧。该功能之后将显示 spark.udf.register(,)

这项工作:

def rank(n):
    if n == "Fair":
        return 1
    elif n == "Good":
        return 2
    elif n == "Better":
        return 3
    elif n == "Best":
        return 4
    else:
        return n
spark.udf.register('RANK(rank), rank)
但是我想要一个更简单的公式。

从pyspark.sql.functions导入col,创建映射,点亮
来自itertools进口链
mapping_expr=create_map([lit(x)表示链中的x(*mapping.items())]))
df.withColumn(“新列”,映射表达式getItem(col(“旧列”))

其中,
映射
是您的dict-不要称它为
列表
,Python中的列表类已经使用了这个名称。

您可以分享一个小示例输入数据来测试潜在代码,以及您的预期输出吗。我有一个RDD,它有三列:名称、排名和价格。“排名”列包含“公平”、“良好”、“更好”和“最佳”字符串。我想让它们变成一列从1到4的整数。我将使用UDF中的函数来更改列。这有意义吗?您使用的是数据帧还是RDD转换?这会大大改变意思。在任何情况下,您能否将rdd的这一细节与问题中的示例值共享?参考或这是否有帮助?如果您使用数据帧(spark也有数据帧,并非所有数据帧都是pandas数据帧!),那么您可以轻松实现
pandas\u udf()
。函数应该返回一个值(秩值),并且应该能够接受秩(来自秩字段的值)。因此,函数采用字符秩并返回整数秩-基本流。顺便说一句,您的问题似乎暗示您希望使用
RDD
,而不是spark数据帧。
def rank(n):
    b = {"Fair": 1, "Good": 2, "Better": 3, "Best": 4}
    rep = {v : k for k, v in b.items()}
    return rep
    

spark.udf.register('RANK', rank)
df.select(
'*',
expr('RANK(Rank)')).show(5)
def rank(n):
    if n == "Fair":
        return 1
    elif n == "Good":
        return 2
    elif n == "Better":
        return 3
    elif n == "Best":
        return 4
    else:
        return n
spark.udf.register('RANK(rank), rank)