В Ruby ruby вы можете использовать опцию 'm
' (многострочный):
/YOUR_REGEXP/m
См. Regexp документацию на ruby-doc.org для получения дополнительной информации.
Ответ Танджина должен работать, хотя я хотел бы предложить другой подход. Вместо того, чтобы узнать, сколько столбцов вы должны добавить в свою схему, чтобы создать столбец типа массив / список. Следующий код преобразует ваши данные в rdd, который вместо кортежей содержит строки [key, value], где value - это список типа double. Тогда вы можете легко применить схему ниже.
def test():
l = [('a', 0.0),
('b', 6),
('c', 44),
('d', 107),
('e', 0),
('f', 3),
('g', 4),
('h', 0.025599999353289604),
('i', 0.03239999711513519),
('j', -0.03205680847167969),
('k',0.10429033637046814),
('l',(34.190006256103516, 31.09000015258789, 31.099994659423828)),
('m',(-9.32000732421875, -9.32000732421875, -11.610000610351562))]
# this schema should work for all your cases
schema = StructType([
StructField("id", StringType(), False),
StructField("num_list", ArrayType(DoubleType(), True), True)
])
rdd = spark.sparkContext.parallelize(l).map(lambda r: (r[0], to_float_list(r[1])))
df = spark.createDataFrame(rdd, schema)
df.show(100, False)
def to_float_list(value):
if type(value) is tuple:
return list(map(float, value))
return [float(value)]
Обратите внимание, что функция to_float_list принимает либо кортеж, либо число и преобразует его в список типа double. Это выведет:
+---+-----------------------------------------------------------+
|id |num_list |
+---+-----------------------------------------------------------+
|a |[0.0] |
|b |[6.0] |
|c |[44.0] |
|d |[107.0] |
|e |[0.0] |
|f |[3.0] |
|g |[4.0] |
|h |[0.025599999353289604] |
|i |[0.03239999711513519] |
|j |[-0.03205680847167969] |
|k |[0.10429033637046814] |
|l |[34.190006256103516, 31.09000015258789, 31.099994659423828]|
|m |[-9.32000732421875, -9.32000732421875, -11.610000610351562]|
+---+-----------------------------------------------------------+
Было бы полезно описать кортеж самостоятельно, прежде чем мы сделаем Spark-эквивалент. В Python кажется, что у вас есть кортеж с двумя элементами. Первый - это String
, а второй - еще один кортеж, состоящий из 3 Double
значений. Первые несколько элементов не обязательно соответствуют этому, но вы не можете ожидать наличия «динамической» схемы, но кажется, что как минимум String и первое число во втором кортеже всегда присутствуют. В любом случае один из способов представить ваш тип этих данных заключается в следующем: (String, (Double, Double, Double))
Соответствующая схема Pyspark для этого будет:
from pyspark.sql.types import StructType, StructField, StringType, DoubleType
schema = StructType([
StructField('char', StringType(), nullable=False),
StructType([
StructField('num_1', DoubleType, nullable=False),
StructField('num_2', DoubleType, nullable=True),
StructField('num_3', DoubleType, nullable=True),
])
])