from __future__ import annotations
import robin_sparkless as rs
def _spark() -> rs.SparkSession:
return rs.SparkSession.builder().app_name("issue_397").get_or_create()
def test_select_struct_field_dot_notation_string() -> None:
spark = _spark()
df = spark.createDataFrame(
[
{"StructValue": {"e1": 42, "e2": "a"}},
{"StructValue": {"e1": 10, "e2": "b"}},
],
[("StructValue", "struct<e1:int,e2:string>")],
)
out = df.select("StructValue.e1").collect()
assert len(out) == 2
assert out[0]["e1"] == 42
assert out[1]["e1"] == 10
def test_select_struct_field_dot_notation_col() -> None:
spark = _spark()
df = spark.createDataFrame(
[{"StructValue": {"e1": 100, "e2": "x"}}],
[("StructValue", "struct<e1:int,e2:string>")],
)
out = df.select(rs.col("StructValue.e1")).collect()
assert len(out) == 1
assert out[0]["e1"] == 100
def test_select_struct_field_multiple_dots() -> None:
spark = _spark()
df = spark.createDataFrame(
[{"outer": {"inner": {"leaf": 7}}}],
[("outer", "struct<inner:struct<leaf:int>>")],
)
out = df.select("outer.inner.leaf").collect()
assert len(out) == 1
assert out[0]["leaf"] == 7