如何将输出(python 字典)发送到火花单元中?

How can I send an Output (python dict) into a spark cell?

我将 docker 与一些容器一起使用(一个用于 Jupyter-Lab,一个用于 Spark,每个 ELK 产品(ElasticSearch、Kibana 和 Logstash)各 3 个)。

我也将 sparkmagic 用于我的 jupyter 笔记本。

所以我要做的是将单元格的输出发送到 spark,然后使用它来创建 spark Dataframe。

首先,我创建了一个使用 pandas 的 python 脚本来分析 Excel 文件(sys.argv[1] 是我的 excel文件和 sys.argv[2] 是我的 sheet 的名字)和 return 我的数据(在我的例子中,数据存储在字典中)

这是我的 python 代码:

import pandas as pd
import numpy as np
import json
from os import sys

def prct_KPY():
    perct_dep = {}
    perct_dep['val1'] = round(df.iloc[0, 1]*100)
    perct_dep['val2'] = round(df.iloc[0, 2]*100)
    perct_dep['val3'] = round(df.iloc[0, 3]*100)
    perct_dep['val4'] = round(df.iloc[0, 4]*100)
    return perct_dep

df = pd.read_excel(sys.argv[1], sys.argv[2], skiprows=50)
var = prct_KPY()
print(var)

此 python 代码存储在名为 "test.py".

的 python 文件中

之后,我想将这个字典用作 spark DataFrame 作为参数(因此我会将它发送到我的 Elastic)。

所以我在笔记本的单元格中使用这段代码来调用我的脚本:

%%!
python3 test.py "Path_Of_My_Excel_File" "Name_Of_My_Sheet"

我得到一个输出:

["{'val1': 96, 'val2': 94, 'val3': 96, 'val4': 96}", '']

这是对象的类型:.

我可以在另一个单元格中使用带有“_”的结果,但是当我尝试在火花单元格中使用它时,它不起作用! 我收到此错误消息:

遇到错误: 名称“”未定义 追溯(最近一次通话): NameError:名称“”未定义

我怎样才能在火花电池中使用这个输出?

感谢您的帮助!

你有什么理由不能在一个段落中完成所有这些吗?只要您的 PySpark 作业使用的 Python 版本可以访问 Pandas,从技术上讲,这应该是可能的。

如果你能做到这一点,这会容易得多。您可以只使用 SparkSession.createDataFrame 函数,它可以获取 pandas 数据帧并返回一个 spark 数据帧。

http://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html

如果没有,您可以尝试 pickling pandas 数据框,然后将其拉入、unpickle,然后执行与上述相同的操作。我对 SparkMagic 一点都不熟悉,所以我不知道使用以前的参数的具体细节,但只要它起作用,它应该也能起作用。

Sparkmagic 有一些细节,因为它适用于远程 Spark 上下文。在您的情况下,基本上您需要做的是使用 Sparkmagic magic 命令 %%send_to_spark。请参考例子 here.

请注意警告: this example assumes that both (py)Spark cluster and your local machine both have the same python packages versions