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