筛选pySpark中的薪资数据

筛选pySpark中的薪资数据,pyspark,Pyspark,我已经为此奋斗了这么久,如果有人能帮我找到解决下一个问题的办法,我会很高兴的 我有这张桌子: +-----+---+------------+ |index| Salary | +-----+---+------------+ | 1| 200 - 300 PA. | | 2| 400 PA. | | 3| 100 - 200 PA. | | 4| 700 - 800 PA. | +-----+---+-----+------+ +-

我已经为此奋斗了这么久,如果有人能帮我找到解决下一个问题的办法,我会很高兴的

我有这张桌子:

+-----+---+------------+
|index|  Salary        |
+-----+---+------------+
|    1|  200 - 300 PA. |
|    2|  400 PA.       |
|    3|  100 - 200 PA. |
|    4|  700 - 800 PA. |
+-----+---+-----+------+
+-----+---+-------+
|index|  Salary   |
+-----+---+-------+
|    1|  250      |
|    2|  400      |
|    3|  150      |
|    4|  750      |
+-----+---+--+----+
“薪资”列为字符串类型。我想用包含范围的平均值(如果没有范围,就用数字)替换工资中的每个字符串,这样数据将是数字而不是字符串。要创建此表,请执行以下操作:

+-----+---+------------+
|index|  Salary        |
+-----+---+------------+
|    1|  200 - 300 PA. |
|    2|  400 PA.       |
|    3|  100 - 200 PA. |
|    4|  700 - 800 PA. |
+-----+---+-----+------+
+-----+---+-------+
|index|  Salary   |
+-----+---+-------+
|    1|  250      |
|    2|  400      |
|    3|  150      |
|    4|  750      |
+-----+---+--+----+
我试着先创建一个薪水数组,这样看起来像这样:

 ["100", "-", "300", "PA."] -
所以我可以从整个字符串中提取数字。我试过这个,但它看起来很糟糕,而且不起作用:

curr = outDF.rdd.map(lambda rec: rec[:]).map(lambda rec : rec[0])
curr  = curr.map(lambda t : (t[1], t[3])).toDF()
new_df = curr.withColumn("_1", custProdSpending["_1"].cast(IntegerType()))

下面是我们如何创建数据帧的方法

df=spark.createDataFrame([(1,'200-300 PA.),(2,'400 PA.),['index','Salary']))
让我们制作一个UDF,从字符串中提取所有整数,并使用Spark 2.4中引入的聚合高阶函数来平均数组中的所有整数

从pyspark.sql.functions导入*
@F.udf(returnType=ArrayType(IntegerType()))
def regexp_extract_all_integer(s,regexp):
如果s==nonelse列表(map(lambda a_字符串:int(a_字符串),re.findall(regexp,s)),则返回None
query=“”聚合(
`{col}`,
铸造(0.0倍),
(acc,x)->acc+x,
acc->acc/大小(`col}`)
)格式为“avg{col}`”
实际_df=df.withColumn(
“所有号码”,
regexp_extract_all_integer(F.col(“str”)、F.lit(r'(\d+))
)
实际值\u df.selectExpr(“*”,query).show()

我将把
regexp\u extract\u all
代码抽象到,因此您不需要维护它。很抱歉代码混乱-PySpark API使您的特定问题难以回答。

以下是我们如何创建数据帧

df=spark.createDataFrame([(1,'200-300 PA.),(2,'400 PA.),['index','Salary']))
让我们制作一个UDF,从字符串中提取所有整数,并使用Spark 2.4中引入的聚合高阶函数来平均数组中的所有整数

从pyspark.sql.functions导入*
@F.udf(returnType=ArrayType(IntegerType()))
def regexp_extract_all_integer(s,regexp):
如果s==nonelse列表(map(lambda a_字符串:int(a_字符串),re.findall(regexp,s)),则返回None
query=“”聚合(
`{col}`,
铸造(0.0倍),
(acc,x)->acc+x,
acc->acc/大小(`col}`)
)格式为“avg{col}`”
实际_df=df.withColumn(
“所有号码”,
regexp_extract_all_integer(F.col(“str”)、F.lit(r'(\d+))
)
实际值\u df.selectExpr(“*”,query).show()

我将把
regexp\u extract\u all
代码抽象到,因此您不需要维护它。很抱歉代码混乱-PySpark API使您的特定问题难以回答。

能否提供一个格式良好的表格,显示输入数据帧和所需的输出?如果没有具有代表性数据的示例输入数据集,很难准确理解您要解决的问题。谢谢,回答您的问题。我不会花时间浏览您的图像并找出如何创建具有代表性的数据帧,但如果您向我提供代码片段,我将很乐意为您提供帮助;)希望现在更好,我尽了最大的努力来说明这个问题。您能提供一个格式良好的表格,显示输入数据帧和所需的输出吗?如果没有具有代表性数据的示例输入数据集,很难准确理解您要解决的问题。谢谢,回答您的问题。我不会花时间浏览您的图像并找出如何创建具有代表性的数据帧,但如果您向我提供代码片段,我将很乐意为您提供帮助;)希望现在情况有所好转,我尽了最大的努力代表这个问题。非常感谢您的帮助!非常感谢你的帮助!