首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JEP将数据从scala传递到python

使用JEP将数据从scala传递到python
EN

Stack Overflow用户
提问于 2019-05-12 08:40:42
回答 2查看 1.1K关注 0票数 2

以下是我要做的事:

  1. 我把数据读入scala
  2. 提取几个列
  3. 使用JEP将创建的数据pass传递给Python脚本
  4. Python脚本将dataframe转换为熊猫,执行一些操作并返回。

但是,我不知道如何将dataframe传递给python脚本。下面是python脚本(这只是示例脚本,而不是实际脚本):

代码语言:javascript
复制
import findspark
findspark.init()
import pandas as pd
#from pyspark.sql import types.*
from pyspark.sql import DataFrame as dataframe

def tes(df: dataframe):
    df = df.toPandas()
    df['concatenate'] = df['country'] + df['datasourceProvidedCountry']
    return dataframe(df)

它一直失败,有以下错误:

代码语言:javascript
复制
jep.JepException: <class 'ImportError'>: py4j.protocol
  at /usr/local/lib64/python3.6/site-packages/jep/java_import_hook.__getattr__(java_import_hook.py:57)
  at /home/hadoop/testpy.<module>(testpy.py:5)
  at jep.Jep.run(Native Method)
  at jep.Jep.runScript(Jep.java:359)
  at jep.Jep.runScript(Jep.java:335)
  ... 49 elided
Caused by: java.lang.ClassNotFoundException: py4j.protocol
  at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
  ... 52 more
代码语言:javascript
复制
spark-shell --conf spark.driver.extraLibraryPath=:/usr/local/lib64/python3.6/site-packages/jep:/usr/local/lib/python3.6/site-packages/py4j/ --jars /home/hadoop/jep-3.8.2.jar

有谁能建议我如何使用Jep将数据从scala传递到pyspark (如果这是重复的,请指出正确的线程,因为我找不到一个线程)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-18 17:36:01

我也有同样的要求,也和Jep试过了。不幸的是,Jep不适用于这个用例。

未找到的py4j.protocol是由Jep ClassEnquirer引起的,当python都有同名的库时,Jep将考虑ClassEnquirer库。您可以通过将py4j从java应用程序中排除在外来解决这个问题,或者创建一个自定义的ClassEnquirer来考虑python py4j。

您还需要更新Jep构造函数,将useSubInterpreter值设置为false并重新构建它。

代码语言:javascript
复制
public Jep(JepConfig config) throws JepException {
    this(config, false);
}

现在应该解决错误了。但是,传递给python函数的对象是包含java引用的PyObject,它不是对象,因此它没有toPandas()函数。

另一种方法可能是使用gRPC或Apache节俭,您可以查看文档以获得更多详细信息。

票数 2
EN

Stack Overflow用户

发布于 2020-02-12 21:01:21

可以使用Apache Spark将数据从Apache Arrow专用( JVM )传递到Apache Arrow代码,因为2.3SPark使用的是Arrow格式,可以同时从JVM和CPython中使用。

有关灵感,请参见2.4.0/sql/core/src/test/scala/org/apache/spark/sql/execution/arrow/ArrowConvertersSuite.scala-diff.html

我在JVM和CPython代码之间使用jep (Java ) DirectNDArray (“off堆”,“零拷贝”)在同一个进程(没有套接字)中传递数据。

请让我知道这是否足够好,并将改善这一答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56097529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档