PySpark Delta表-生成符号链接[java.lang.NoSuchMethodError]

PySpark Delta表-生成符号链接[java.lang.NoSuchMethodError],pyspark,amazon-athena,presto,delta-lake,python-poetry,Pyspark,Amazon Athena,Presto,Delta Lake,Python Poetry,我对目前的情况有所了解: 增量表位于S3 我想通过雅典娜查询这个表 sparkversion3.1.1和hadoop3.2.0 要做到这一点,我需要遵循文档:和 我使用的是MacBookPro,在我的~/.zshrc中配置了环境变量,用于我的小型POC: export PYSPARK\u PYTHON=/bin/python3 导出PYSPARK_驱动程序=/bin/python3 export JAVA_HOME=“/Library/JAVA/JavaVirtualMachines/ado

我对目前的情况有所了解:

  • 增量表位于
    S3
  • 我想通过雅典娜查询这个表
  • spark
    version
    3.1.1
    hadoop
    3.2.0
要做到这一点,我需要遵循文档:和

我使用的是
MacBookPro
,在我的~/.zshrc中配置了
环境变量,用于我的小型
POC

export PYSPARK\u PYTHON=/bin/python3
导出PYSPARK_驱动程序=/bin/python3
export JAVA_HOME=“/Library/JAVA/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/HOME”
导出SPARK\u HOME=/site packages/pyspark
导出PYARROW\u忽略\u时区=1
我设置了一个小的
pyspark
项目,在那里我创建了我的
spark\u会话

from pyspark.sql import SparkSession
import findspark
import boto3


def create_session() -> SparkSession:
    findspark.init()

    spark_session = SparkSession.builder.appName("delta_session") \
        .master("local[*]") \
        .getOrCreate()

    sparkContext = spark_session.sparkContext

    boto_default_session = boto3.setup_default_session()

    boto_session = boto3.Session(
        botocore_session=boto_default_session, profile_name="dev", region_name="eu-west-1"
    )
    credentials = boto_session.get_credentials()

    print(
        f"Hadoop version = {sparkContext._jvm.org.apache.hadoop.util.VersionInfo.getVersion()}"
    )

    hadoopConfiguration = sparkContext._jsc.hadoopConfiguration()
    hadoopConfiguration.set(
        "fs.s3a.aws.credentials.provider", 
        "com.amazonaws.auth.profile.ProfileCredentialsProvider"
    )
    hadoopConfiguration.set("fs.s3.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
    hadoopConfiguration.set("fs.s3a.awsAccessKeyId", credentials.access_key)
    hadoopConfiguration.set("fs.s3a.awsSecretAccessKey", credentials.secret_key)
    hadoopConfiguration.set("fs.s3a.endpoint", "s3.amazonaws.com")

    return spark_session
然后我运行:

spark_session = create_session()

from delta.tables import *

delta_table = DeltaTable.forPath(spark_session, "s3a://<my-path-to-delta-table>")

# This works
df = delta_table.toDF()
print(df.show(10))

# This fails
delta_table.generate("symlink_format_manifest")
我的尝试:

  • 我尝试过在没有诗意的情况下运行它,直接下载spark并以这种方式运行
  • 我尝试了一个较旧的hadoop版本,因为他们似乎在使用它
  • 我找到了这个,但对我没有帮助
  • 我也尝试过
    io.delta:delta-core_2.12:0.8.0
  • 我已经验证了
    delta
    版本
    0.7.0
    0.8.0
    应该支持
    spark 3.1.1
  • 我还尝试添加
    pyarrow
    并通过以下方式进行设置:
    spark\u session.conf.set(“spark.sql.execution.arrow.enabled”,“true”)
  • 我还尝试添加
    ——packages org.apache.hadoop:hadoop common:3.2.0
    ,但这也没有帮助
  • 我也试着用
    spark 3.1.1和hadoop 3.2.0运行它,但我给了它
    --包“io.delta:delta-core_2.12:0.7.0,com.amazonaws:aws java sdk pom:1.11.375,org.apache.hadoop:hadoop aws:2.7.7”
    ,但这给了我一个错误:
在我看来,
org.apache.spark.sql.catalyst.expressions.ScalaUDF$.apply$default$6()Z
由于某种原因无法调用。我找不到更多要安装的东西了

My
pyproject.toml

[工具.诗歌]
name=“…”
version=“1.0.0”
description=“…”
作者=[“…”]
[工具、诗歌、依赖性]
python=“3.7.8”
预提交=“^2.8.2”
pyspark={version=“3.1.1”,可选=true,附加=[“sql”]}
findspark=“^1.4.2”
boto3=“*”
pyarrow=“3.0.0”
[工具.诗歌.开发依赖项]
pytest=“6.1.1”
ipdb=“0.13.3”
pytest cov=“2.10.1”
对于任何可能遇到相同问题的人来说都是非常好的


更新

根据Alex的评论,我通过以下方式解决了问题:

  • Spark版本
    3.0.2
  • Hadoop版本
    3.2.0
  • 增量
    0.8.0
  • spark提交--packages“io.delta:delta-core_2.12:0.8.0,com.amazonaws:aws java sdk pom:1.11.375,org.apache.hadoop:hadoop aws:3.2.0”--conf“spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension”--conf“spark.delta.logStore.class=org.apache.spark.sql.delta.storage.S3SingleDriverLogStore”~/code/dataops delta-infrastructure/run.py

您需要将Spark降级为Spark 3.0.2才能使用Delta 0.8.0-不幸的是,Spark 3.1.1对引擎盖下使用Delta的内部部件进行了许多更改,这破坏了二进制兼容性。最有可能的是,您的具体问题是由
ScalaUDF
的参数更改引起的(这)

谢谢您,Alex,这救了我一天!我不可能在文档中找到它,因为他们说它应该在这里兼容:是的,我自己也受到了这种不兼容的影响,正在等待与3.1兼容的发行版。你知道它是否支持
3.1.1
吗?据我所知,它很快就会出现,但不能准确地说。代码已经在git中,因此您可以编译自己的coolio!谢谢回复!
py4j.protocol.Py4JJavaError: An error occurred while calling z:io.delta.tables.DeltaTable.forPath.
: java.lang.NumberFormatException: For input string: "100M"