PySpark df.write正在将不同数量的记录加载到不同的表中

2024-04-29 20:19:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为df_result的数据帧,它有36条记录。我需要将此数据帧加载到SQL Server中的两个不同表中。我试图在pyspark中使用两种不同的模式:appendoverwrite来加载这些表。但我看到的结果没有意义

我有两个目标表:

TableA (empty)

TableB (contains data)

我需要将df_result加载到这两个表中,但使用不同的modes

我的代码如下:

对于表A(为空):

df_result.write.jdbc(url=jdbcUrl, table='abc.TableA', mode = 'append')

按预期从df_result加载所有36条记录

对于表B(有数据):

df_result.write.option("truncate", "true").jdbc(url=jdbcUrl, table='abc.TableB', mode = 'overwrite')

仅从df_result加载18条记录,这很奇怪

两个表的dataframe和DDL的架构如下所示:

df_result

root
 |-- SID: decimal(19,0) (nullable = true)
 |-- Code: string (nullable = true)
 |-- LocName: string (nullable = true)
 |-- Country: string (nullable = true)
 |-- Cnumber: integer (nullable = true)
 |-- StartDate: timestamp (nullable = true)
 |-- EndDate: timestamp (nullable = true)
 |-- CurrentIND: string (nullable = true)



TableA:

CREATE TABLE [abc].[TableA]
(
    [SID] [decimal](18, 0) NOT NULL,
    [Code] [char](3) NOT NULL,
    [LocName] [varchar](50) NOT NULL,
    [Country] [varchar](50) NOT NULL,
    [Cnumber] [int] NOT NULL,
    [StartDate] [datetime2](7) NOT NULL,
    [EndDate] [datetime2](7) NOT NULL,
    [CurrentIND] [char](1) NOT NULL
)
WITH
(
    DISTRIBUTION = ROUND_ROBIN,
    CLUSTERED COLUMNSTORE INDEX
);


TableB:

CREATE TABLE [abc].[TableB]
(
    [SID] [decimal](18, 0) NOT NULL,
    [Code] [char](3) NOT NULL,
    [LocName] [varchar](50) NOT NULL,
    [Country] [varchar](50) NOT NULL,
    [Cnumber] [int] NOT NULL,
    [StartDate] [datetime2](7) NOT NULL,
    [EndDate] [datetime2](7) NOT NULL,
    [CurrentIND] [char](1) NOT NULL
)
WITH
(
    DISTRIBUTION = ROUND_ROBIN,
    CLUSTERED COLUMNSTORE INDEX
);

我希望TableATableB都有相同的数据,至少在我第一次运行它时是这样,因为TableAappend模式下是空的。但事实并非如此,因为两行加载的记录数不同

这是非常奇怪的,因为两条线应该做相同的事情。我无法理解这里出了什么问题。有人能解释一下这里出了什么问题吗?提前谢谢


Tags: 数据truedfstring记录notresultnull