我想从子字符串列表和相应的频率列表中创建一个字符串。例如我的df_in
样子如下:
+-------------------------+-----------+
| substr | frequency |
+-------------------------+-----------+
| ['ham', 'spam', 'eggs'] | [1, 2, 3] |
| ['foo', 'bar'] | [2, 1] |
+-------------------------+-----------+
我希望我df_out
看起来像这样:
+--------------------------------+
| output |
+--------------------------------+
| 'ham spam spam eggs eggs eggs' |
| 'foo foo bar' |
+--------------------------------+
由于数据集非常大(~22Mio 行),我想尽可能避免 for 循环。有什么优雅的方法可以实现这一目标吗?
非常感谢!
编辑:我目前的做法:
import pyspark.sql.functions as F
import pyspark.sql.types as T
def create_text(l_sub, l_freq):
l_str = [(a+' ')*b if isinstance(b, int) else (a+' ') for a, b in zip(l_sub, l_freq)]
return ''.join(l_str)
create_str = F.udf(lambda x, y: create_text(x, y), T.StringType())
df = df.withColumn('output', create_str(df_in.sbustr, df_in.frequency))
问题:
我读到为了加快计算速度,UDF 应该以 pyspark 方式重写。我不知道如何做到这一点。我还发现dtype
了df_in.frequency
is array<decimal(4.0)>
。所以我试图将这些值转换为int
first 或int
在运行时将它们转换为。