使用pyspark的方式处理LCS问题

lcs动态规划法
在这里插入图片描述二维数组表达

  • 使用二维数组C[m,n]
  • C[i,j]记录序列的Xi和Yj的最长子序列长度
  • 当i = 0或者j = 0时,空序列是Xi和Yj的最长公共子序列,故C[i,j] = 0

在这里插入图片描述
创建hive表并导入要lcs的数据

create table lcs_data(a string,b string)
row format delimited fields terminated by '\t';

load data local inpath '/home/zhanzhy/Documents/data/lcs_data.txt' overwrite into table lcs_data;

select * from lcs_data;

lcs_data.txt数据

技术领先的绿色低能耗数据中心	绿色能耗数据中心
词袋模型(Bag Of Words)	词袋模型
所有词单元	对应词单元
MF/LSA/LDA等降维的方法	LDA模型,ESA模型,LSA模型
运输问题的优化目标	运送货物的重量
对文本进行语义标注	人工规则进行标注

lcs.py

# -*- coding:utf-8 -*-
from pyspark.sql.functions import udf
from pyspark.sql.types import IntegerType
from pyspark.sql import SparkSession

# 解决编码问题
import sys

reload(sys)
sys.setdefaultencoding('utf-8')

spark = SparkSession.builder \
    .appName("LCS Test") \
    .enableHiveSupport() \
    .getOrCreate()

df = spark.sql("select * from lcs_data")
df.show()


def lcs(a, b):
    n = len(a)
    m = len(b)
    l = [[0] * (m + 1) for x in range(n + 1)]
    for i in range(1, n + 1):
        for j in range(1, m + 1):
            if a[i - 1] == b[j - 1]:
                l[i][j] = l[i - 1][j - 1] + 1
            else:
                # 使用max需from pyspark.sql.functions import udf
                l[i][j] = max(l[i - 1][j], l[i][j - 1])
                # l[i][j] = l[i - 1][j] if l[i - 1][j] > l[i][j - 1] \
                #     else l[i][j - 1]
    return l[-1][-1]


lcs_udf = udf(lcs, IntegerType())
df_score = df.withColumn("score", lcs_udf(df.a, df.b))
df_score.show()

run_lcs.sh

PARK_PYTHON=./ANACONDA/dev/bin/python
cd $SPARK_HOME
./bin/spark-submit \
        --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./ANACONDA/dev/bin/python \
        --master yarn-cluster \
        --files $HIVE_HOME/conf/hive-site.xml \
        --archives /home/zhanzhy/Documents/code/pyspark/dev.zip#ANACONDA \
        /home/zhanzhy/Documents/code/pyspark/lcs.py

执行sh run_lcs.sh在yarn上的结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值