Databricks JDBC connection

สวัสดีครับ มีเรื่องมารบกวนสอบถามครับ

Pipeline situation:

Azure Blob => Azure Databricks => Azure SQL Server

…ไม่แน่ใจว่าเราสามารถใช้ Databricks ต่อ JDBC connection เพื่ออ่าน data จาก blob แล้วเขียนลงใน Azure SQL Server ได้ไหมครับ หรือถ้าในสถานการณ์นี้สามาถทำแบบไหนได้บ้างครับ

ขอบคุณล่วงหน้าครับ

ทำตามนี้เลย: Apache Spark connector for SQL Server - Spark connector for SQL Server | Microsoft Docs

อย่าลืมใส่ jar file ก่อนนะ

azure databricks มันก็คือ spark, จะคุยกะ database ก็ต้องใช้ jdbc driver, ซึ่ง azure sql server จริงๆ แล้วไส้ในมันคือ sql server

ทีนี้ ไม่แน่ใจว่าคุณใช้ databricks ยังไง แต่ถ้าใช้ pyspark, ใช้ jdbc ได้
แต่ถ้าใช้ pure python, อันนี้ต้องไปลง python library เพิ่มนอกรอบเอาเอง มันคุยกันคนละท่า

2 Likes

ขอบคุณมากครับ
ขอโทษทีตอบกลับช้าครับ ตอนนี้สามารถต่อกับ sql server ได้แล้วครับ สามารถเขียน data กลับลงไปที่ sql server ได้แล้ว แต่ติดเรื่อง datatype ของ pyspark กับ spark sql ที่เหมือนจะต่างกันอยู่ครับ

ตอนนี้ใช้วิธีเขียน pyspark ต่อ sql server ด้วย jdbc ตามด้านล่างครับ
โดยกำหนด datatype ตามนี้ครับ PySpark StructType & StructField Explained with Examples - Spark by {Examples}

columns = [“language”,“users_count”]
data = [(“Java”, “20000”), (“Python”, “100000”), (“Scala”, “3000”)]
df = spark.createDataFrame(data).toDF(*columns)

df.write.format(‘jdbc’).option(‘url’, url).option(‘user’, username).option(‘password’, password).option(‘table’, tablename).option(‘driver’, driver)

ถ้าจะเปลี่ยนไปใช้ sql จะสามารถคุย sql server ด้วย jdbc แล้วเขียน data กลับเข้าไปแบบ pyspark ข้างบนได้อย่างไงบ้างครับ ลองดูจาก docs แล้วก็ยังหาตัวอย่างไม่เจอครับ

ตัดเรื่อง terminology ไปก่อน กันงง

spark เนี่ย มันคุยได้หลายท่า ถ้าใช้ python จะเรียกว่า pyspark

pyspark เอง สามารถใช้ได้สองแบบ:
1: spark sql → df.withColumn("col_name", df["col_name"].cast(IntegerType()))
2: sql

df.createOrReplaceTempView("listing")
boundary.createOrReplaceTempView("boundary")

listing_w_province = spark.sql(
    """
    SELECT l.listing_id, l.latitude, l.longitude, b.province
    FROM listing as l, boundary as b
    WHERE l.latitude IS NOT NULL 
        AND l.longitude IS NOT NULL 
        AND ST_Intersects(ST_Point(l.longitude, l.latitude), ST_GeomFromWKT(geometry))
    """
)

ถามว่า จะเขียนดาต้าไปที่ sql server ยังไง ก็ต้อง:

  1. อ่าน raw data ที่อยู่ใน blob storage → จะได้ spark dataframe มาตัวนึง ซึ่งตรงนี้ ถ้าไม่มีอะไรแปลกๆ ก็น่าจะ infer datatype ให้เองแล้ว
  2. df.write() ลงไปที่ sql server

edit: fix typo

2 Likes

ขอบคุณมากครับ ตอนนี้พอเข้าใจแล้วครับ ไปอ่าน docs เพิ่มเติมมา เดี๋ยวลองไปทำดูก่อน อาจจะมีมาถามเพิ่มเติมนะครับ ขอบคุณครับ