簡體   English   中英

使用 PyCharm 讀取 pyspark 中的 avro 文件

[英]Read avro files in pyspark with PyCharm

我對火花很陌生,我已將 pyspark 庫導入到 pycharm venv 並編寫以下代碼:

# Imports
from pyspark.sql import SparkSession

# Create SparkSession
spark = SparkSession.builder \
    .appName('DataFrame') \
    .master('local[*]') \
    .getOrCreate()

spark.conf.set("spark.sql.shuffle.partitions", 5)
path = "file_path"
df = spark.read.format("avro").load(path)

,一切似乎都沒問題,但是當我想閱讀 avro 文件時,我收到消息:

pyspark.sql.utils.AnalysisException: '未能找到數據源:avro。 Avro 是自 Spark 2.4 以來的內置但外部數據源模塊。 請按照“Apache Avro 數據源指南”的部署部分部署應用程序。;'

當我轉到此頁面時:>https://spark.apache.org/docs/latest/sql-data-sources-avro.html有這樣的東西:

在此處輸入圖片說明

我不知道必須實現這個,在 PyCharm 中下載一些東西,或者你必須找到外部文件來修改?

謝謝你的幫助!

更新 (2019-12-06):因為我使用的是 Anaconda,所以我打開了 Anaconda prompt 並復制了以下代碼:

pyspark --packages com.databricks:spark-avro_2.11:4.0.0

它下載了一些模塊,然后我回到 PyCharm 並出現相同的錯誤。

我從 PyCharm 中的pyspark下載了pyspark 2.4.4版軟件包。 並在 spark 配置中添加了spark-avro_2.11-2.4.4.jar文件,並且能夠成功地重新創建您的錯誤,即pyspark.sql.utils.AnalysisException: 'Failed to find data source: avro. Avro is built-in but external data source module since Spark 2.4. Please deploy the application as per the deployment section of "Apache Avro Data Source Guide".;' pyspark.sql.utils.AnalysisException: 'Failed to find data source: avro. Avro is built-in but external data source module since Spark 2.4. Please deploy the application as per the deployment section of "Apache Avro Data Source Guide".;'

要解決此問題,請按照以下步驟操作:

  1. 卸載從 conda 下載的 pyspark 包。
  2. 這里下載並解壓spark-2.4.4-bin-hadoop2.7.tgz
  3. 在 Run > Environment Varibales 中,您應該將SPARK_HOME設置為<download_path>/spark-2.4.3-bin-hadoop2.7並將PYTHONPATH設置為$SPARK_HOME/python/lib/py4j-0.10.7-src.zip:$SPARK_HOME/python
  4. 這里下載spark-avro_2.11-2.4.4.jar文件。

現在您應該能夠從 PyCharm 運行 pyspark 代碼。 試試下面的代碼:

# Imports
from pyspark.sql import SparkSession
from pyspark import SparkConf, SparkContext

#Create SparkSession
spark = SparkSession.builder \
    .appName('DataFrame') \
    .master('local[*]')\
    .config('spark.jars', '<path>/spark-avro_2.11-2.4.4.jar') \
    .getOrCreate()


df = spark.read.format('avro').load('<path>/userdata1.avro')

df.show()

上面的代碼可以工作,但 PyCharm 會抱怨 pyspark 模塊。 要刪除它並啟用代碼完成功能,請遵循以下附加步驟:

  1. 在 Project Structure 中,單擊 Add Content root 並添加spark-2.4.3-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip

現在您的項目結構應如下所示:

在此處輸入圖片說明

輸出: 在此處輸入圖片說明

pyspark --jars /<path_to>/spark-avro_<version>.jar
Spark 3.0.2 對我有用

簡單的解決方案可以使用spark-submit命令在 pycharm 內的Terminal選項卡中提交模塊,如下所示。

命令的一般語法:

spark-submit --packages <package_name> <script_path>

由於 avro 是所需的包, com.databricks:spark-avro_2.11:4.0.0應包含com.databricks:spark-avro_2.11:4.0.0包。 所以最后的命令將是

spark-submit --packages com.databricks:spark-avro_2.11:4.0.0 <script_path>

你的 Spark 版本和你的 avro JAR 版本應該同步
例如:如果您使用的是 spark 3.1.2 並且您的 avro jar 版本應該是 spark-avro_2.12-3.1.2.jar
示例代碼:

spark = SparkSession.builder.appName('DataFrame').\
        config('spark.jars','C:\\Users\\<<User_Name>>\\Downloads\\spark-avro_2.12-3.1.2.jar').getOrCreate()
df = spark.read.format('avro').load('C:\\Users\\<<user name>>\\Downloads\\sample.avro')
df.show()

Output:
+-------------------+-------+------+------------+------------+--------------------+-------+-----------+--------------------+-----------------+------------------+-------+------------+--------------+--------------+----------+--------------------+
|           datetime|country|region|publisher_id|placement_id|       impression_id|consent|   hostname|                uuid|placement_type_id|iab_device_type_id|site_id|request_type|placement_type|bid_url_domain|app_bundle|                 tps|
+-------------------+-------+------+------------+------------+--------------------+-------+-----------+--------------------+-----------------+------------------+-------+------------+--------------+--------------+----------+--------------------+
|2021-07-30 14:55:18|   null|  null|        5016|        5016|8bdf2cf1-3a17-473...|      4|test.server|9515d578-9ee0-462...|                0|                 5|   5016|      advast|         video|          null|      null|{5016 -> {5016, n...|
|2021-07-30 14:55:22|   null|  null|        2702|        2702|ab3b63d1-a916-4d7...|      4|test.server|9515d578-9ee0-462...|                1|                 2|   2702|         adi|        banner|          null|      null|{2702 -> {2702, n...|
|2021-07-30 14:55:24|   null|  null|        1106|        1106|574f078f-0fc6-452...|      4|test.server|9515d578-9ee0-462...|                1|                 2|   1106|         adi|        banner|          null|      null|{1106 -> {1106, n...|
|2021-07-30 14:55:25|   null|  null|        1107|        1107|54bf5cf8-3438-400...|      4|test.server|9515d578-9ee0-462...|                1|                 2|   1107|         adi|        banner|          null|      null|{1107 -> {1107, n...|
|2021-07-30 14:55:27|   null|  null|        4277|        4277|b3508668-3ad5-4db...|      4|test.server|9515d578-9ee0-462...|                1|                 2|   4277|         adi|        banner|          null|      null|{4277 -> {4277, n...|
+-------------------+-------+------+------------+------------+--------------------+-------+-----------+--------------------+-----------------+------------------+-------+------------+--------------+--------------+----------+--------------------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM