怎么在java的flink中调用python程序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么在java的flink中调用python程序?相关的知识,希望对你有一定的参考价值。

怎么将python程序结合进flink中啊?带参数调用python程序

一、在java类中直接执行python语句

import org.python.util.PythonInterpreter;
public class Firstjavascript
public static void main(String args[])

PythonInterpreter interpreter = new PythonInterpreter();

interpreter.exec("days=('mod','Tue','Wed','Thu','Fri','Sat','Sun'); ");
interpreter.exec("print days[1];");

// main


调用的结果是Tue,在控制台显示出来,这是直接进行调用的。

二、在java中调用本机python脚本中的函数

首先建立一个python脚本,名字为:my_utils.py

def adder(a, b):
return a + b
然后建立一个java类,用来测试,

java类代码 FirstJavaScript:

import org.python.core.PyFunction;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;

public class FirstJavaScript
public static void main(String args[])

PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile("C:\\Python27\\programs\\my_utils.py");
PyFunction func = (PyFunction) interpreter.get("adder",
PyFunction.class);

int a = 2010, b = 2;
PyObject pyobj = func.__call__(new PyInteger(a), new PyInteger(b));
System.out.println("anwser = " + pyobj.toString());

// main


得到的结果是:anwser = 2012

三、使用java直接执行python脚本

建立脚本inputpy

#open files

print 'hello'
number=[3,5,2,0,6]
print number
number.sort()
print number
number.append(0)
print number
print number.count(0)
print number.index(5)

建立java类,调用这个脚本:

import org.python.util.PythonInterpreter;

public class FirstJavaScript
public static void main(String args[])

PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile("C:\\Python27\\programs\\input.py");
// main


得到的结果是:
hello
[3, 5, 2, 0, 6]
[0, 2, 3, 5, 6]
[0, 2, 3, 5, 6, 0]
2
3
参考技术A 1. 在java类中直接执行python语句
此方法需要引用 org.python包,需要下载Jpython。在这里先介绍一下Jpython。下面引入百科的解释:

Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。Jython也有很多从CPython中继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它提供了对其实现语言的一切存取。所以Jython不仅给你提供了Python的库,同时也提供了所有的Java类。这使其有一个巨大的资源库。
这里我建议下载最新版本的Jpython,因为可以使用的python函数库会比老版本的多些,目前最新版本为2.7。
下载jar包请点击Download Jython 2.7.0 - Standalone Jar
下载安装程序请点击Download Jython 2.7.0 - Installer
如果使用maven依赖添加的话,使用下面的语句
<dependency>
<groupId>org.python</groupId>
<artifactId>jython-standalone</artifactId>
<version>2.7.0</version>
</dependency>
以上准备好了,就可以直接在java类中写python语句了,具体代码如下:
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("a=[5,2,3,9,4,0]; ");
interpreter.exec("print(sorted(a));"); //此处python语句是3.x版本的语法
interpreter.exec("print sorted(a);"); //此处是python语句是2.x版本的语法
输出结果如下:这里会看到输出的结果都是一样的,也就是说Jpython兼容python2.x和3.x版本的语句,运行速度会比直接运行python程序稍慢一点。
但是每次运行结果都会提示console: Failed to install ”: java.nio.charset.UnsupportedCharsetException: cp0. 这样看起来很烦,因为每次运行结果都会出现红色的提示语句,以为是错误,程序员应该都不愿意看到这一幕,得想个办法解决。
解决方法如下:
在要执行的代码上右键, Run As>Run Configurations,选择第二个页签Arguments,在VM arguments中添加以下语句
-Dpython.console.encoding=UTF-8
然后Apply->Run就可以了。本回答被提问者采纳
参考技术B Algorithm做算法题,Review点评英文文章,Tip总结技术技巧,Share做技术分享。每周打卡一次,这就是ARTS打卡。

1. 做算法题

LeetCdoe面试题 17.26. 稀疏相似度

题目描述:

两个(具有不同单词的)文档的交集(intersection)中元素的个数除以并集(union)中元素的个数,就是这两个文档的相似度。例如,1, 5, 3 和 1, 7, 2, 3 的相似度是 0.4,其中,交集的元素有 2 个,并集的元素有 5 个。给定一系列的长篇文档,每个文档元素各不相同,并与一个 ID 相关联。它们的相似度非常“稀疏”,也就是说任选 2 个文档,相似度都很接近 0。请设计一个算法返回每对文档的 ID 及其相似度。只需输出相似度大于 0 的组合。请忽略空文档。为简单起见,可以假定每个文档由一个含有不同整数的数组表示。

输入为一个二维数组 docs,docs[i] 表示 id 为 i 的文档。返回一个数组,其中每个元素是一个字符串,代表每对相似度大于 0 的文档,其格式为 id1,id2: similarity,其中 id1 为两个文档中较小的 id,similarity 为相似度,精确到小数点后 4 位。以任意顺序返回数组均可。

示例:输入:
[
[14, 15, 100, 9, 3],
[32, 1, 9, 3, 5],
[15, 29, 2, 6, 8, 7],
[7, 10]
]
输出:
[
“0,1: 0.2500”,
“0,2: 0.1000”,
“2,3: 0.1429”
]
解题思路:

Python中集合有交和并运算,将题目中的列表转换为集合后可得到交集、并集大小。题目的难点在于相似度保留4位小数。由于计算机二进制无法精确表示浮点数,round函数做四舍五入可能不精确,为了消除二进制存储浮点数会截断(变小)的影响,浮点数加上1e-9后进行round计算。

解题代码:

class Solution:
def computeSimilarities(self, docs: List[List[int]]) -> List[str]:
def div_fun(x:int, y:int) -> str:
div = x / y + 1e-9
div_str = str(round(div, 4))
if len(div_str) < 6:
div_str = div_str + '0'*(6-len(div_str))
return div_str

L_str = []

for i in range(len(docs)):
docs[i] = set(docs[i])

for i in range(len(docs)):
for j in range(i+1, len(docs)):
intersection_ij = docs[i] & docs[j]
union_ij = docs[i] | docs[j]
if len(intersection_ij) == 0:
continue
else:
similarity_ij = div_fun(len(intersection_ij),len(union_ij))
L_str.append(str(i)+','+str(j)+': '+similarity_ij)

return L_str
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2.点评英文文章

文章《What is Python Good for?》是一名Java程序员写的,推荐使用Python作为一项兵器加入到程序员的武器库中。文中列举了Python的诸多优点,总结一下主要是易上手、生态丰富、框架成熟、应用广泛,就像AK47自动步枪。

3. 技术技巧

独立博客想要引导到微信公众号上,除了在文章末尾放一张公众号的二维码,还有什么办法呢?可以使用openwrite实现readmore功能,需要关注微信公众号,从公众号获取验证码才能继续阅读文章。

4. 技术分享

学习PyFlink教程,python与flink结合是发展的必然,python应用于数据分析和机器学习领悟,flink应用于大数据流计算领悟,两者结合互相提升。将flink的能力输出python用户,python生态的计算功能运行到flink上,相辅相成。目前pyflink1.11可支持python数据处理库pandas,并可实现kmeans等算法。

以上是关于怎么在java的flink中调用python程序?的主要内容,如果未能解决你的问题,请参考以下文章

shell程序中怎么获取调用参数?

如何在Java中调用Python代码

java怎么点用python脚本?

python怎么调用phantomJS程序

Flink的类加载器解析

java调用python,有第三方包gensim,怎么调用呢,是报错。求教....