如何在Python中使用结构化流实现雪花连接器?

时间:2020-08-12 18:34:52

标签: python apache-spark streaming snowflake-stream

目前,我有接受输入并创建数据流的代码。我的目标是将数据上传到雪花。目前,我正在尝试这种方法,是否有更简单的方法可以解决此问题。还是可以将此内容写入pandas df,然后将pandas df上传到雪花?以前它只能用于结构化流媒体,而无法与雪花连接。

from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql.types import *

sfconn = {
    "sfURL": f"{os.getenv('SNOWFLAKE_ACCOUNT')}.snowflakecomputing.com",
    "sfUser": os.getenv('SNOWFLAKE_USER'),
    "sfPassword": os.getenv('SNOWFLAKE_PASSWORD'),
    "sfDatabase": "x",
    "sfSchema": "x",
    "sfWarehouse": "x"
}

spark = SparkSession.builder\
    .appName("snowflake-connector")\
    .getOrCreate()

df = spark \
              .readStream\
              .format('json') \
              .schema(spark_schemas['x']) \
              .load(f"s3a://{x_path}")

out = df \
    .writeStream\
    .outputMode("append")\
    .option("dbtable", "scratch_table")\
    .options(sfconn)\
    .trigger(processingTime='1 minutes')\
    .format("snowflake")\
    .start()

现在正在显示

options() takes 1 positional argument but 2 were given

 : java.lang.ClassNotFoundException: Failed to find data source: snowflake. 

1 个答案:

答案 0 :(得分:0)

随后的第一个错误-options接受指定options的可变对数。如果您有选择作为地图,则需要使用**map语法来“ unpack”,例如:

opts = {'inferSchema': "true", "header": "false"}
df = spark.read.options(**opts)
   .format("csv")
   .schema("ticker String,date Date, price Float")
   .load(".../datasets/dow-quotes.csv")

对于第二个错误-您只需要指定连接器的正确名称-net.snowflake.spark.snowflake而不是snowflake,并确保在提交作业时指定了Snowflake Spark连接器。有关更多详细信息,请参见雪花documentation