Skip to content

Commit 226798b

Browse files
Merge branch 'main' into helmeleegy-SNOW-2676993
2 parents a0a19ac + 54b84f5 commit 226798b

File tree

5 files changed

+91
-1
lines changed

5 files changed

+91
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@
157157
- `groupby.any`
158158
- `groupby.all`
159159
- `groupby.unique`
160+
- `to_snowflake`
160161
- `to_snowpark`
161162
- Make faster pandas disabled by default (opt-in instead of opt-out).
162163
- Improve performance of `drop_duplicates` by avoiding joins when `keep!=False` in faster pandas.

src/snowflake/snowpark/dataframe.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6171,7 +6171,16 @@ def with_column_renamed(
61716171
else:
61726172
raise TypeError(f"{str(existing)} must be a column name or Column object.")
61736173

6174-
to_be_renamed = [x for x in self._output if x.name.upper() == old_name.upper()]
6174+
from snowflake.snowpark import context
6175+
6176+
if context._is_snowpark_connect_compatible_mode:
6177+
to_be_renamed = [
6178+
x for x in self._output if quote_name(x.name) == quote_name(old_name)
6179+
]
6180+
else: # this is wrong, but we need to keep it for backward compatibility. Should be removed in the future when Snowpark Python Client has a major version bump.
6181+
to_be_renamed = [
6182+
x for x in self._output if x.name.upper() == old_name.upper()
6183+
]
61756184
if not to_be_renamed:
61766185
raise ValueError(
61776186
f'Unable to rename column "{existing}" because it doesn\'t exist.'

src/snowflake/snowpark/modin/plugin/compiler/snowflake_query_compiler.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2282,6 +2282,34 @@ def to_snowflake(
22822282
index: bool = True,
22832283
index_label: Optional[IndexLabel] = None,
22842284
table_type: Literal["", "temp", "temporary", "transient"] = "",
2285+
) -> None:
2286+
"""
2287+
Wrapper around _to_snowflake_internal to be supported in faster pandas.
2288+
"""
2289+
if self._relaxed_query_compiler is not None and not index:
2290+
self._relaxed_query_compiler._to_snowflake_internal(
2291+
name=name,
2292+
if_exists=if_exists,
2293+
index=index,
2294+
index_label=index_label,
2295+
table_type=table_type,
2296+
)
2297+
else:
2298+
self._to_snowflake_internal(
2299+
name=name,
2300+
if_exists=if_exists,
2301+
index=index,
2302+
index_label=index_label,
2303+
table_type=table_type,
2304+
)
2305+
2306+
def _to_snowflake_internal(
2307+
self,
2308+
name: Union[str, Iterable[str]],
2309+
if_exists: Optional[Literal["fail", "replace", "append"]] = "fail",
2310+
index: bool = True,
2311+
index_label: Optional[IndexLabel] = None,
2312+
table_type: Literal["", "temp", "temporary", "transient"] = "",
22852313
) -> None:
22862314
self._warn_lost_snowpark_pandas_type("to_snowflake")
22872315
handle_if_exists_for_to_snowflake(if_exists=if_exists, name=name)

tests/integ/modin/test_faster_pandas.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1752,6 +1752,40 @@ def test_series_to_datetime(session):
17521752
assert_series_equal(snow_result, native_result)
17531753

17541754

1755+
@sql_count_checker(query_count=4)
1756+
def test_to_snowflake(session):
1757+
with session_parameter_override(
1758+
session, "dummy_row_pos_optimization_enabled", True
1759+
):
1760+
# create tables
1761+
table_name = Utils.random_name_for_temp_object(TempObjectType.TABLE)
1762+
session.create_dataframe(
1763+
native_pd.DataFrame([[2, 12], [1, 11], [3, 13]], columns=["A", "B"])
1764+
).write.save_as_table(table_name, table_type="temp")
1765+
1766+
# create snow dataframes
1767+
df = pd.read_snowflake(table_name)
1768+
df.to_snowflake(table_name, if_exists="replace", index=False)
1769+
snow_result = pd.read_snowflake(table_name).sort_values(by="A")
1770+
1771+
# verify that the input dataframe has a populated relaxed query compiler
1772+
assert df._query_compiler._relaxed_query_compiler is not None
1773+
assert df._query_compiler._relaxed_query_compiler._dummy_row_pos_mode is True
1774+
# verify that the output dataframe also has a populated relaxed query compiler
1775+
assert snow_result._query_compiler._relaxed_query_compiler is not None
1776+
assert (
1777+
snow_result._query_compiler._relaxed_query_compiler._dummy_row_pos_mode
1778+
is True
1779+
)
1780+
1781+
# create pandas dataframes
1782+
native_df = df.to_pandas()
1783+
native_result = native_df.sort_values(by="A")
1784+
1785+
# compare results
1786+
assert_frame_equal(snow_result, native_result)
1787+
1788+
17551789
@sql_count_checker(query_count=3)
17561790
def test_to_snowpark(session):
17571791
with session_parameter_override(

tests/integ/scala/test_dataframe_suite.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2686,6 +2686,24 @@ def test_rename_function_multiple(session):
26862686
Utils.check_answer(df2, [Row(1, 2)])
26872687

26882688

2689+
@pytest.mark.skipif(
2690+
"config.getoption('local_testing_mode', default=False)",
2691+
reason="DataFrame.rename is not supported in Local Testing",
2692+
)
2693+
def test_rename_with_case_sensitive_column_name(session):
2694+
from snowflake.snowpark import context
2695+
from unittest.mock import patch
2696+
2697+
with patch.object(context, "_is_snowpark_connect_compatible_mode", True):
2698+
df = session.create_dataframe([[1, 2]], schema=["ab", '"ab"'])
2699+
df2 = df.rename('"ab"', "ab1")
2700+
assert df2.schema.names == ["AB", "AB1"]
2701+
Utils.check_answer(df2, [Row(1, 2)])
2702+
df3 = df.rename({"ab": "ab1"})
2703+
assert df3.schema.names == ["AB1", '"ab"']
2704+
Utils.check_answer(df3, [Row(1, 2)])
2705+
2706+
26892707
@pytest.mark.skipif(
26902708
"config.getoption('local_testing_mode', default=False)",
26912709
reason="DataFrame.rename is not supported in Local Testing",

0 commit comments

Comments
 (0)